Release 4.0 and do "small" refactoring to fix problems with packing (#593)

This commit is contained in:
Rafał Mikrut 2022-01-19 22:35:07 +01:00 committed by GitHub
parent 17e45b959f
commit a0d17fccea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
86 changed files with 908 additions and 834 deletions

6
Cargo.lock generated
View File

@ -555,7 +555,7 @@ dependencies = [
[[package]]
name = "czkawka_cli"
version = "3.3.1"
version = "4.0.0"
dependencies = [
"czkawka_core",
"img_hash",
@ -564,7 +564,7 @@ dependencies = [
[[package]]
name = "czkawka_core"
version = "3.3.1"
version = "4.0.0"
dependencies = [
"audiotags",
"bincode",
@ -598,7 +598,7 @@ dependencies = [
[[package]]
name = "czkawka_gui"
version = "3.3.1"
version = "4.0.0"
dependencies = [
"chrono",
"crossbeam-channel",

View File

@ -1,4 +1,4 @@
## Version 4.0.0 - ?
## Version 4.0.0 - 20.01.2022r
- Multithreading support for collecting files to check(2/3x speedup on 4 thread processor and SSD) - [#502](https://github.com/qarmin/czkawka/pull/502), [#504](https://github.com/qarmin/czkawka/pull/504)
- Add multiple translations - Polish, Italian, French, German, Russian ... - [#469](https://github.com/qarmin/czkawka/pull/469), [#508](https://github.com/qarmin/czkawka/pull/508), [5be](https://github.com/qarmin/czkawka/commit/5be801e76395855f07ab1da43cdbb8bd0b843834)
- Add support for finding similar videos - [#460](https://github.com/qarmin/czkawka/pull/460)

View File

@ -1,6 +1,6 @@
[package]
name = "czkawka_cli"
version = "3.3.1"
version = "4.0.0"
authors = ["Rafał Mikrut <mikrutrafal@protonmail.com>"]
edition = "2018"
description = "CLI frontend of Czkawka"
@ -9,7 +9,7 @@ homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"
[dependencies]
czkawka_core = { path = "../czkawka_core", version = "3.3.1" }
czkawka_core = { path = "../czkawka_core", version = "4.0.0" }
structopt = "0.3.25"
# For enum types

View File

@ -1,6 +1,6 @@
[package]
name = "czkawka_core"
version = "3.3.1"
version = "4.0.0"
authors = ["Rafał Mikrut <mikrutrafal@protonmail.com>"]
edition = "2018"
description = "Core of Czkawka app"

View File

@ -9,5 +9,5 @@ fallback_language = "en"
# (Required) The path to the assets directory.
# The paths inside the assets directory should be structured like so:
# `assets_dir/{language}/{domain}.ftl`
assets_dir = "../i18n"
assets_dir = "i18n"

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = Velmi vysoká
core_similarity_high = Vysoká
core_similarity_medium = Střední
core_similarity_small = Malá
core_similarity_very_small = Velmi malá
core_similarity_minimal = Minimální
core_cannot_open_dir = Nelze otevřít dir { $dir }, důvod { $reason }
core_cannot_read_entry_dir = Nelze číst záznam v adresáři { $dir }, důvod { $reason }
core_cannot_read_metadata_dir = Metadata nelze číst v adresáři { $dir }, důvod { $reason }
core_file_not_utf8_name = Soubor { $name } nemá platný název UTF-8 (některé znaky nemusí být zobrazeny)
core_file_modified_before_epoch = Soubor { $name } se zdá být před Unix Epoch upraven
core_folder_modified_before_epoch = Složka { $name } se zdá být upravena před Unixem Epoch
core_file_no_modification_date = Nelze získat datum úpravy ze souboru { $name }, důvod { $reason }
core_folder_no_modification_date = Nelze získat datum úpravy ze složky { $name }, důvod { $reason }
core_missing_no_chosen_included_directory = Musí být uveden alespoň jeden adresář
core_directory_wildcard_no_supported = Adresáře: Zástupné znaky v cestě nejsou podporovány, ignoruji { $path }
core_directory_relative_path = Adresáře: Zástupné znaky v cestě nejsou podporovány, ignoruji { $path }
core_directory_must_exists = Adresáře: Poskytnutá cesta ke složce musí skončit, ignoruji { $path }
core_directory_must_be_directory = Adresáře: Poskytnutá cesta musí směřovat do adresáře, ignoruje { $path }
core_included_directory_zero_valid_directories = CHYBA zahrnutí adresáře: Nenalezena ani jedna správná cesta k zahrnutí, která je vyžadována
core_excluded_directory_pointless_slash = Adresáře: Vyloučení / je bezúčelné, protože to znamená, že žádné soubory nebudou naskenovány
core_directory_overlap = Adresáře: Všechny adresáře pro vyhledávání se překrývají s vyloučením adresářů
core_ffmpeg_not_found = Nelze najít správnou instalaci FFmpeg
core_ffmpeg_missing_in_snap = Podobná videa v současné době nefungují se snapem, pokud chcete nápovědu sledovat - { $url }

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = Sehr Hoch
core_similarity_high = Hoch
core_similarity_medium = Mittel
core_similarity_small = Klein
core_similarity_very_small = Sehr klein
core_similarity_minimal = Minimale
core_cannot_open_dir = Verzeichnis { $dir } kann nicht geöffnet werden, Grund { $reason }
core_cannot_read_entry_dir = Kann Eintrag in Verzeichnis { $dir } nicht lesen, Grund { $reason }
core_cannot_read_metadata_dir = Metadaten können in Verzeichnis { $dir } nicht gelesen werden, Grund { $reason }
core_file_not_utf8_name = Datei { $name } hat keinen gültigen UTF-8-Namen (einige Zeichen dürfen nicht angezeigt werden)
core_file_modified_before_epoch = Datei { $name } scheint vor der Unix-Epoche geändert zu werden
core_folder_modified_before_epoch = Ordner { $name } scheint vor der Unix-Epoche geändert zu werden
core_file_no_modification_date = Konnte das Änderungsdatum von Datei { $name } nicht abrufen, Grund { $reason }
core_folder_no_modification_date = Konnte das Änderungsdatum aus dem Ordner { $name } nicht abrufen, Grund { $reason }
core_missing_no_chosen_included_directory = Mindestens ein Verzeichnis muss angegeben werden
core_directory_wildcard_no_supported = Verzeichnisse: Wildcards im Pfad werden nicht unterstützt, { $path } wird ignoriert
core_directory_relative_path = Verzeichnisse: Relativer Pfad wird nicht unterstützt, { $path } wird ignoriert
core_directory_must_exists = Verzeichnisse: Der angegebene Ordnerpfad muss beendet werden, { $path } wird ignoriert
core_directory_must_be_directory = Verzeichnisse: Der angegebene Pfad muss auf das Verzeichnis zeigen und { $path } ignorieren
core_included_directory_zero_valid_directories = Inklusive Verzeichnis-FEHLER: Nicht einmal einen korrekten Pfad zu inkludiert, der erforderlich ist
core_excluded_directory_pointless_slash = Verzeichnisse: Ausschließen / ist sinnlos, weil es bedeutet, dass keine Dateien gescannt werden
core_directory_overlap = Verzeichnisse: Alle Verzeichnisse zum Suchen von Überlappungen mit ausgeschlossenen Verzeichnissen
core_ffmpeg_not_found = Keine richtige Installation von FFmpeg gefunden
core_ffmpeg_missing_in_snap = Ähnliche Videos funktionieren derzeit nicht mit Snap, wenn du Hilfe möchtest - { $url }

View File

@ -0,0 +1,31 @@
# Core
core_similarity_very_high = Very High
core_similarity_high = High
core_similarity_medium = Medium
core_similarity_small = Small
core_similarity_very_small = Very Small
core_similarity_minimal = Minimal
core_cannot_open_dir = Cannot open dir {$dir}, reason {$reason}
core_cannot_read_entry_dir = Cannot read entry in dir {$dir}, reason {$reason}
core_cannot_read_metadata_dir = Cannot read metadata in dir {$dir}, reason {$reason}
core_file_not_utf8_name = File {$name} does not have a valid UTF-8 name (some characters may not be shown)
core_file_modified_before_epoch = File {$name} seems to be modified before Unix Epoch
core_folder_modified_before_epoch = Folder {$name} seems to be modified before Unix Epoch
core_file_no_modification_date = Unable to get modification date from file {$name}, reason {$reason}
core_folder_no_modification_date = Unable to get modification date from folder {$name}, reason {$reason}
core_missing_no_chosen_included_directory = At least one directory must be provided
core_directory_wildcard_no_supported = Directories: Wildcards in path are not supported, ignoring { $path }
core_directory_relative_path = Directories: Relative path are not supported, ignoring { $path }
core_directory_must_exists = Directories: Provided folder path must exist, ignoring { $path }
core_directory_must_be_directory = Directories: Provided path must point at the directory, ignoring { $path }
core_included_directory_zero_valid_directories = Included Directory ERROR: Not found even one correct path to included which is required
core_excluded_directory_pointless_slash = Directories: Excluding / is pointless, because it means that no files will be scanned
core_directory_overlap = Directories: All directories to search overlaps with excluded directories
core_ffmpeg_not_found = Cannot find proper installation of FFmpeg
core_ffmpeg_missing_in_snap = Similar Videos don't work currently with snap, if you want help look at - { $url }
core_saving_to_cache = Saved to file { $number } cache entries
core_loading_from_cache = Loaded from cache { $number } entries

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = Muy alta
core_similarity_high = Alta
core_similarity_medium = Medio
core_similarity_small = Pequeño
core_similarity_very_small = Muy pequeño
core_similarity_minimal = Mínimo
core_cannot_open_dir = No se puede abrir el directorio { $dir }, razón { $reason }
core_cannot_read_entry_dir = No se puede leer la entrada en directorio { $dir }, razón { $reason }
core_cannot_read_metadata_dir = No se pueden leer metadatos en el directorio { $dir }, razón { $reason }
core_file_not_utf8_name = El archivo { $name } no tiene un nombre UTF-8 válido (algunos caracteres pueden no mostrarse)
core_file_modified_before_epoch = El archivo { $name } parece ser modificado antes de Unix Epoch
core_folder_modified_before_epoch = La carpeta { $name } parece ser modificada antes del Epoch Unix
core_file_no_modification_date = No se puede obtener la fecha de modificación del archivo { $name }, razón { $reason }
core_folder_no_modification_date = No se puede obtener la fecha de modificación de la carpeta { $name }, razón { $reason }
core_missing_no_chosen_included_directory = Debe proporcionarse al menos un directorio
core_directory_wildcard_no_supported = Directorios: Los comodines en la ruta no son compatibles, ignorando { $path }
core_directory_relative_path = Directorios: No se admite la ruta relativa, ignorando { $path }
core_directory_must_exists = Directorios: La ruta de la carpeta debe salir, ignorando { $path }
core_directory_must_be_directory = Directorios: La ruta proporcionada debe apuntar al directorio, ignorando { $path }
core_included_directory_zero_valid_directories = ERROR del directorio incluido: No se ha encontrado ni una ruta correcta a incluida que es necesaria
core_excluded_directory_pointless_slash = Directorios: Excluyendo / es inútil, ya que no se analizarán archivos
core_directory_overlap = Directorios: Todos los directorios para buscar superposiciones con directorios excluidos
core_ffmpeg_not_found = No se puede encontrar la instalación correcta de FFmpeg
core_ffmpeg_missing_in_snap = Los Videos Similares no funcionan actualmente con el snap, si quieres ayuda mira - { $url }

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = Très haute
core_similarity_high = Haute
core_similarity_medium = Moyenne
core_similarity_small = Basse
core_similarity_very_small = Très basse
core_similarity_minimal = Minimale
core_cannot_open_dir = Impossible douvrir le répertoire { $dir }, raison: { $reason }
core_cannot_read_entry_dir = Impossible de lire l'entrée dans le répertoire { $dir }, raison: { $reason }
core_cannot_read_metadata_dir = Impossible de lire les métadonnées dans le répertoire { $dir }, raison: { $reason }
core_file_not_utf8_name = Le fichier { $name } n'a pas de nom UTF-8 valide (certains caractères ne peuvent pas être affichés)
core_file_modified_before_epoch = Le fichier { $name } semble avoir été modifié avant l'époque Unix
core_folder_modified_before_epoch = Le dossier { $name } semble avoir été modifié avant l'époque Unix
core_file_no_modification_date = Impossible d'obtenir la date de modification du fichier { $name }, raison: { $reason }
core_folder_no_modification_date = Impossible d'obtenir la date de modification du dossier { $name }, raison: { $reason }
core_missing_no_chosen_included_directory = Au moins un répertoire doit être fourni
core_directory_wildcard_no_supported = Répertoires : Les jokers dans le chemin ne sont pas pris en charge, ignorant { $path }
core_directory_relative_path = Répertoires : Le chemin relatif n'est pas pris en charge, ignorant { $path }
core_directory_must_exists = Répertoires : Le chemin du dossier fourni doit se terminer, ignorant { $path }
core_directory_must_be_directory = Répertoires : Le chemin fourni doit pointer dans le répertoire, { $path }
core_included_directory_zero_valid_directories = ERREUR de répertoire inclus : Aucun chemin n'a été trouvé, même un chemin correct à inclure qui est requis
core_excluded_directory_pointless_slash = Répertoires: Exclure / est inutile, car cela signifie qu'aucun fichier ne sera scanné
core_directory_overlap = Répertoires : Tous les répertoires pour rechercher des chevauchements avec des répertoires exclus
core_ffmpeg_not_found = Impossible de trouver une installation correcte de FFmpeg
core_ffmpeg_missing_in_snap = Les vidéos similaires ne fonctionnent pas actuellement avec un instantané, si vous voulez de l'aide - { $url }

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = Altissima
core_similarity_high = Alta
core_similarity_medium = Media
core_similarity_small = Piccola
core_similarity_very_small = Piccolissima
core_similarity_minimal = Minima
core_cannot_open_dir = Impossibile aprire cartella { $dir }, motivo { $reason }
core_cannot_read_entry_dir = Impossibile leggere elemento nella cartella { $dir }, ragione { $reason }
core_cannot_read_metadata_dir = Impossibile leggere metadati nella cartella { $dir }, ragione { $reason }
core_file_not_utf8_name = Il file { $name } non ha un nome UTF-8 valido (alcuni caratteri potrebbero non essere mostrati)
core_file_modified_before_epoch = Il file { $name } sembra essere stato modificato prima dell'Epoca Unix
core_folder_modified_before_epoch = La cartella { $name } sembra essere stato modificata prima dell'Epoca Unix
core_file_no_modification_date = Impossibile recuperare data di modifica dal file { $name }, ragione { $reason }
core_folder_no_modification_date = Impossibile recuperare data di modifica dalla cartella { $name }, ragione { $reason }
core_missing_no_chosen_included_directory = Almeno una directory deve essere fornita
core_directory_wildcard_no_supported = Cartelle: i caratteri jolly nel percorso non sono supportati, ignorando { $path }
core_directory_relative_path = Directories: Il percorso relativo non è supportato, ignorando { $path }
core_directory_must_exists = Directories: Il percorso della cartella fornito deve uscire, ignorando { $path }
core_directory_must_be_directory = Directories: Il percorso fornito deve puntare alla directory, ignorando { $path }
core_included_directory_zero_valid_directories = ERRORE Directory incluso: Non trovato nemmeno un percorso corretto incluso che è richiesto
core_excluded_directory_pointless_slash = Cartelle: Escludere / è inutile, perché significa che nessun file verrà scansionato
core_directory_overlap = Directories: Tutte le directory per cercare sovrapposizioni con directory escluse
core_ffmpeg_not_found = Impossibile trovare la corretta installazione di FFmpeg
core_ffmpeg_missing_in_snap = Video simili non funzionano attualmente con snap, se si desidera aiutare a guardare - { $url }

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = 非常に高い
core_similarity_high = 高い
core_similarity_medium = ミディアム
core_similarity_small = 小
core_similarity_very_small = 非常に小さい
core_similarity_minimal = 最小
core_cannot_open_dir = ディレクトリを開くことができません { $dir }、理由 { $reason }
core_cannot_read_entry_dir = Dir { $dir } でエントリを読み込めません、理由 { $reason }
core_cannot_read_metadata_dir = Dir { $dir } でメタデータを読み込めません、理由 { $reason }
core_file_not_utf8_name = ファイル { $name } に有効な UTF-8 名がありません (一部の文字は表示されない可能性があります)
core_file_modified_before_epoch = ファイル { $name } は Unix Epoch より前に変更されているようです
core_folder_modified_before_epoch = フォルダ { $name } は、Unix Epoch の前に変更されているようです
core_file_no_modification_date = ファイル { $name } から変更日を取得できません、理由 { $reason }
core_folder_no_modification_date = フォルダ { $name } から変更日を取得できません、理由 { $reason }
core_missing_no_chosen_included_directory = 少なくとも 1 つのディレクトリを指定する必要があります。
core_directory_wildcard_no_supported = ディレクトリ: パス内のワイルドカードはサポートされていません。 { $path } を無視してください
core_directory_relative_path = ディレクトリ: 相対パスはサポートされていません。 { $path } を無視してください
core_directory_must_exists = ディレクトリ: 指定されたフォルダパスは、 { $path } を無視して終了する必要があります
core_directory_must_be_directory = ディレクトリ: 指定されたパスはディレクトリを指す必要があります。 { $path } を無視します
core_included_directory_zero_valid_directories = 含まれるディレクトリエラー: 必須の正しいパスが1つも見つかりません
core_excluded_directory_pointless_slash = ディレクトリ: ファイルがスキャンされないことを意味するため、除外/無意味です
core_directory_overlap = ディレクトリ: 除外されたディレクトリとオーバーラップを検索するすべてのディレクトリ
core_ffmpeg_not_found = 適切なFFmpegのインストールが見つかりません
core_ffmpeg_missing_in_snap = ヘルプを見たい場合は、現在同様のビデオはスナップでは動作しません - { $url }

View File

@ -0,0 +1,28 @@
# Core
core_similarity_very_high = Bardzo Duże
core_similarity_high = Duże
core_similarity_medium = Średnie
core_similarity_small = Małe
core_similarity_very_small = Bardzo Małe
core_similarity_minimal = Minimalne
core_cannot_open_dir = Nie można otworzyć folderu { $dir }, powód { $reason }
core_cannot_read_entry_dir = Nie można odczytać danych z folderu { $dir }, powód { $reason }
core_cannot_read_metadata_dir = Nie można odczytać metadanych folderu { $dir }, powód { $reason }
core_file_not_utf8_name = Plik { $name } nie posiada nazwy zakodowanej za pomocą UTF-8(niektóre znaki mogą się nie wyświetlać)
core_file_modified_before_epoch = Plik { $name } ma datę modyfikacji sprzed epoki unixa
core_folder_modified_before_epoch = Folder { $name } ma datę modyfikacji sprzed epoki unixa
core_file_no_modification_date = Nie udało się pobrać daty modyfikacji z pliku { $name }, powód { $reason }
core_folder_no_modification_date = Nie udało się pobrać daty modyfikacji z folderu { $name }, powód { $reason }
core_missing_no_chosen_included_directory = Należy podać co najmniej jeden katalog
core_directory_wildcard_no_supported = Katalogi: Wildcard na ścieżce nie są obsługiwane, ignorowanie { $path }
core_directory_relative_path = Katalogi: Ścieżka względna nie jest wspierana, ignorowanie { $path }
core_directory_must_exists = Katalogi: Podana ścieżka do folderu musi istnieć, ignorowanie { $path }
core_directory_must_be_directory = Katalogi: Podana ścieżka musi wskazywać na katalog, ignorowanie { $path }
core_included_directory_zero_valid_directories = Błąd katalogów do przeszukiwania: Nie znaleziono nawet jednej poprawnej ścieżki do przeszukania
core_excluded_directory_pointless_slash = Katalogi: Wykluczanie folderu / jest bezcelowe, ponieważ oznacza to, że żadne pliki nie zostaną sprawdzone
core_directory_overlap = Katalogi: Wszystkie katalogi do wyszukiwania pokrywają się z wykluczonymi
core_ffmpeg_not_found = Nie można odnaleźć poprawnej instalacji FFmpeg
core_ffmpeg_missing_in_snap = Wyszukiwanie podobnych filmów nie działa obecnie w snapach, jeśli chcesz pomóc spójrz na - { $url }
core_saving_to_cache = Saved to file { $number } cache entries
core_loading_from_cache = Loaded from cache { $number } entries

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = Muito alto
core_similarity_high = Alto
core_similarity_medium = Média
core_similarity_small = Pequeno
core_similarity_very_small = Muito Pequeno
core_similarity_minimal = Mínimo
core_cannot_open_dir = Não é possível abrir o diretório { $dir }, razão { $reason }
core_cannot_read_entry_dir = Não é possível ler a entrada no diretório { $dir }, razão { $reason }
core_cannot_read_metadata_dir = Não é possível ler os metadados no diretório { $dir }, razão { $reason }
core_file_not_utf8_name = Arquivo { $name } não tem nome UTF-8 válido (alguns caracteres não podem ser exibidos)
core_file_modified_before_epoch = Arquivo { $name } parece ser modificado antes do Epoch Unix
core_folder_modified_before_epoch = A pasta { $name } parece ser modificada antes do Epoch Unix
core_file_no_modification_date = Não foi possível obter a data de modificação do arquivo { $name }, motivo { $reason }
core_folder_no_modification_date = Não foi possível obter a data de modificação da pasta { $name }, motivo { $reason }
core_missing_no_chosen_included_directory = Pelo menos um diretório deve ser fornecido
core_directory_wildcard_no_supported = Directorias: Caracteres curinga no caminho não são suportados, ignorando { $path }
core_directory_relative_path = Directorias: Caminho relativo não são suportados, ignorando { $path }
core_directory_must_exists = Directórios: Caminho da pasta fornecida deve sair, ignorando { $path }
core_directory_must_be_directory = Diretórios: Caminho fornecido deve apontar para o diretório, ignorando { $path }
core_included_directory_zero_valid_directories = ERRO do Diretório incluído: Não foi encontrado nenhum caminho correto que é necessário incluir
core_excluded_directory_pointless_slash = Directorias: Excluir / não faz sentido, porque significa que nenhum arquivo será escaneado
core_directory_overlap = Diretórios: Todos os diretórios para pesquisar sobreposições com diretórios excluídos
core_ffmpeg_not_found = Instalação adequada do FFmpeg não encontrada
core_ffmpeg_missing_in_snap = Vídeos similares não funcionam atualmente com o snap, se você quiser ajudar a olhar - { $url }

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = Очень высокий
core_similarity_high = Высокий
core_similarity_medium = Средний
core_similarity_small = Маленький
core_similarity_very_small = Очень маленький
core_similarity_minimal = Минимальный
core_cannot_open_dir = Невозможно открыть каталог { $dir }, причина { $reason }
core_cannot_read_entry_dir = Невозможно прочитать запись в директории { $dir }, причина { $reason }
core_cannot_read_metadata_dir = Невозможно прочитать метаданные в директории { $dir }, причина { $reason }
core_file_not_utf8_name = У файла { $name } неверное имя UTF-8 (некоторые символы не могут быть показаны)
core_file_modified_before_epoch = Файл { $name } может быть изменен до начала эпохи Unix
core_folder_modified_before_epoch = Папка { $name } изменяется до начала эпохи Unix
core_file_no_modification_date = Не удается получить дату изменения из файла { $name }, причина { $reason }
core_folder_no_modification_date = Не удается получить дату изменения из папки { $name }, причина { $reason }
core_missing_no_chosen_included_directory = Должен быть указан хотя бы один каталог
core_directory_wildcard_no_supported = Директории: Не поддерживаются шаблоны в директории, игнорируется { $path }
core_directory_relative_path = Директории: Относительный путь не поддерживается, игнорируется { $path }
core_directory_must_exists = Директории: Указанный путь к папке должен быть закрыт, игнорируется { $path }
core_directory_must_be_directory = Директории: Указанный путь должен указывать на директорию, игнорируя { $path }
core_included_directory_zero_valid_directories = Включенный каталог ОШИБКА: Не найден даже один правильный путь к включённому которому требуется
core_excluded_directory_pointless_slash = Директории: Исключение / бессмысленно, потому что ни один файл не будет просканирован
core_directory_overlap = Каталоги: Все директории для поиска совпадают с исключенными каталогами
core_ffmpeg_not_found = Не удается найти надлежащую установку FFmpeg
core_ffmpeg_missing_in_snap = Похожие видео не работают в данный момент, если вы хотите помочь посмотреть - { $url }

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = Дуже високий
core_similarity_high = Високий
core_similarity_medium = Медіум
core_similarity_small = Маленький
core_similarity_very_small = Дуже малий
core_similarity_minimal = Мінімальні
core_cannot_open_dir = Не вдалося відкрити папку { $dir }, причина { $reason }
core_cannot_read_entry_dir = Не вдалося прочитати запис в папці { $dir }, причина { $reason }
core_cannot_read_metadata_dir = Не вдалося прочитати метадані в папці { $dir }, причина { $reason }
core_file_not_utf8_name = Файл { $name } не має припустимого імені UTF-8 (деякі символи не можуть бути показані)
core_file_modified_before_epoch = Файл { $name } Схоже, змінено перед Unix Epoch
core_folder_modified_before_epoch = Папка { $name } здається змінена до Unix Epoch
core_file_no_modification_date = Не вдалося отримати дату модифікації з файлу { $name }, причина { $reason }
core_folder_no_modification_date = Не вдалося отримати дату модифікації з папки { $name }, причина { $reason }
core_missing_no_chosen_included_directory = Необхідно вказати принаймні один каталог
core_directory_wildcard_no_supported = Директорія: Шаблони в шляху не підтримуються, ігноруючи { $path }
core_directory_relative_path = Каталог: Відносний шлях не підтримується, ігноруючи { $path }
core_directory_must_exists = Каталог: Наданий шлях до папки повинен вийти, ігноруючи { $path }
core_directory_must_be_directory = Каталог: Наданий шлях повинен вказувати на каталог, ігноруючи { $path }
core_included_directory_zero_valid_directories = Включена помилка в каталозі: не знайдено навіть один правильний шлях до включеного, який є обов'язковим
core_excluded_directory_pointless_slash = Теки: виключення / без урахування безточних, тому що це означає, що файли не будуть скановані
core_directory_overlap = Каталоги: Усі каталоги для пошуку перетинаються з виключеними каталогами
core_ffmpeg_not_found = Не вдалося знайти правильне встановлення FFmpeg
core_ffmpeg_missing_in_snap = Подібні відео в даний час не працюють з знімком, якщо ви хочете, щоб допомогти вам переглянути - { $url }

View File

@ -0,0 +1,25 @@
# Core
core_similarity_very_high = 非常高
core_similarity_high = 高
core_similarity_medium = 中
core_similarity_small = 小的
core_similarity_very_small = 非常小
core_similarity_minimal = 最小化
core_cannot_open_dir = 无法打开目录 { $dir },因为 { $reason }
core_cannot_read_entry_dir = 无法在目录 { $dir } 中读取条目,因为 { $reason }
core_cannot_read_metadata_dir = 无法读取目录 { $dir } 中的元数据,因为 { $reason }
core_file_not_utf8_name = 文件 { $name } 无效的 UTF-8 名称 (可能无法显示一些字符)
core_file_modified_before_epoch = 文件 { $name } 似乎在 Unix Epoch前被修改
core_folder_modified_before_epoch = 文件夹 { $name } 似乎在Unix Epoch前被修改
core_file_no_modification_date = 无法从文件 { $name } 获取修改日期,因为 { $reason }
core_folder_no_modification_date = 无法从文件夹 { $name } 获取修改日期,因为 { $reason }
core_missing_no_chosen_included_directory = 必须至少提供一个目录
core_directory_wildcard_no_supported = 目录:不支持路径中的通配符,忽略 { $path }
core_directory_relative_path = 目录:不支持相对路径,忽略 { $path }
core_directory_must_exists = 目录:提供的文件夹路径必须退出,忽略 { $path }
core_directory_must_be_directory = 目录:提供的路径必须指向目录,忽略 { $path }
core_included_directory_zero_valid_directories = 包括目录错误:即使找不到一个需要包含的正确路径
core_excluded_directory_pointless_slash = 目录:不包括 / 无意义,因为它意味着没有文件将被扫描
core_directory_overlap = 目录:所有要搜索与排除目录重叠的目录
core_ffmpeg_not_found = 找不到正确安装FFmpeg
core_ffmpeg_missing_in_snap = 类似的视频目前不适用于快照,如果您想要帮助查看- { $url }

View File

@ -20,8 +20,8 @@ use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
use crate::fl;
use crate::localizer::generate_translation_hashmap;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(Debug)]
pub struct ProgressData {
@ -173,7 +173,7 @@ impl BigFile {
let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -186,7 +186,7 @@ impl BigFile {
let entry_data = match entry {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -196,7 +196,7 @@ impl BigFile {
let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -224,7 +224,7 @@ impl BigFile {
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
@ -249,7 +249,7 @@ impl BigFile {
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
@ -257,7 +257,7 @@ impl BigFile {
}
},
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));

View File

@ -19,8 +19,8 @@ use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::*;
use crate::fl;
use crate::localizer::generate_translation_hashmap;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
use crate::similar_images::{AUDIO_FILES_EXTENSIONS, IMAGE_RS_BROKEN_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS};
#[derive(Debug)]
@ -218,7 +218,7 @@ impl BrokenFiles {
let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -231,7 +231,7 @@ impl BrokenFiles {
let entry_data = match entry {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -241,7 +241,7 @@ impl BrokenFiles {
let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -269,7 +269,7 @@ impl BrokenFiles {
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
@ -298,7 +298,7 @@ impl BrokenFiles {
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
@ -306,7 +306,7 @@ impl BrokenFiles {
}
},
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));

View File

@ -14,8 +14,8 @@ use rayon::prelude::*;
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::fl;
use crate::localizer::generate_translation_hashmap;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(Debug)]
pub struct ProgressData {
@ -372,7 +372,7 @@ where
let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -385,7 +385,7 @@ where
let entry_data = match entry {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -395,7 +395,7 @@ where
let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -436,7 +436,7 @@ where
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_folder_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_folder.display().to_string())])
));
@ -444,7 +444,7 @@ where
}
},
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_folder_no_modification_date",
generate_translation_hashmap(vec![("name", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -460,7 +460,7 @@ where
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
@ -487,7 +487,7 @@ where
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
@ -495,7 +495,7 @@ where
}
},
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));
@ -521,7 +521,7 @@ where
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
@ -581,7 +581,7 @@ where
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
@ -589,7 +589,7 @@ where
}
},
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));

View File

@ -3,8 +3,8 @@ use std::time::SystemTime;
use crate::common::Common;
use crate::common_messages::Messages;
use crate::fl;
use crate::localizer::generate_translation_hashmap;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(Clone, Default)]
pub struct Directories {
@ -27,7 +27,7 @@ impl Directories {
let start_time: SystemTime = SystemTime::now();
if included_directory.is_empty() {
text_messages.errors.push(fl!("core_missing_no_chosen_included_directory"));
text_messages.errors.push(flc!("core_missing_no_chosen_included_directory"));
return false;
}
@ -36,7 +36,7 @@ impl Directories {
let mut checked_directories: Vec<PathBuf> = Vec::new();
for directory in directories {
if directory.to_string_lossy().contains('*') {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_wildcard_no_supported",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
@ -45,7 +45,7 @@ impl Directories {
#[cfg(not(target_family = "windows"))]
if directory.is_relative() {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
@ -53,7 +53,7 @@ impl Directories {
}
#[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
@ -61,14 +61,14 @@ impl Directories {
}
if !directory.exists() {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_must_exists",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
if !directory.is_dir() {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_must_be_directory",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
@ -78,7 +78,7 @@ impl Directories {
}
if checked_directories.is_empty() {
text_messages.warnings.push(fl!("core_included_directory_zero_valid_directories"));
text_messages.warnings.push(flc!("core_included_directory_zero_valid_directories"));
return false;
}
@ -101,11 +101,11 @@ impl Directories {
for directory in directories {
let directory_as_string = directory.to_string_lossy();
if directory_as_string == "/" {
text_messages.errors.push(fl!("core_excluded_directory_pointless_slash"));
text_messages.errors.push(flc!("core_excluded_directory_pointless_slash"));
break;
}
if directory_as_string.contains('*') {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_wildcard_no_supported",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
@ -113,7 +113,7 @@ impl Directories {
}
#[cfg(not(target_family = "windows"))]
if directory.is_relative() {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
@ -121,7 +121,7 @@ impl Directories {
}
#[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
@ -133,7 +133,7 @@ impl Directories {
continue;
}
if !directory.is_dir() {
text_messages.warnings.push(fl!(
text_messages.warnings.push(flc!(
"core_directory_must_be_directory",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
@ -276,7 +276,7 @@ impl Directories {
}
if self.included_directories.is_empty() {
text_messages.errors.push(fl!("core_directory_overlap"));
text_messages.errors.push(flc!("core_directory_overlap"));
return false;
}

View File

@ -26,6 +26,8 @@ use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::*;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(PartialEq, Eq, Clone, Debug, Copy)]
pub enum HashType {
@ -1277,7 +1279,9 @@ pub fn save_hashes_to_file(hashmap: &BTreeMap<String, FileEntry>, text_messages:
}
}
text_messages.messages.push(format!("Properly saved to file {} cache entries.", how_much));
text_messages
.messages
.push(flc!("core_saving_to_cache", generate_translation_hashmap(vec![("number", how_much.to_string())])));
}
}
pub fn load_hashes_from_file(text_messages: &mut Messages, delete_outdated_cache: bool, type_of_hash: &HashType, is_prehash: bool) -> Option<BTreeMap<u64, Vec<FileEntry>>> {
@ -1352,9 +1356,9 @@ pub fn load_hashes_from_file(text_messages: &mut Messages, delete_outdated_cache
}
}
text_messages.messages.push(format!(
"Properly loaded {} cache entries.",
hashmap_loaded_entries.values().map(|e| e.len()).sum::<usize>()
text_messages.messages.push(flc!(
"core_loading_from_cache",
generate_translation_hashmap(vec![("number", hashmap_loaded_entries.values().map(|e| e.len()).sum::<usize>().to_string())])
));
return Some(hashmap_loaded_entries);

View File

@ -22,6 +22,6 @@ pub mod common_extensions;
pub mod common_items;
pub mod common_messages;
pub mod common_traits;
pub mod localizer;
pub mod localizer_core;
pub const CZKAWKA_VERSION: &str = env!("CARGO_PKG_VERSION");

View File

@ -8,10 +8,10 @@ use once_cell::sync::Lazy;
use rust_embed::RustEmbed;
#[derive(RustEmbed)]
#[folder = "../i18n/"]
#[folder = "i18n/"]
struct Localizations;
pub static LANGUAGE_LOADER: Lazy<FluentLanguageLoader> = Lazy::new(|| {
pub static LANGUAGE_LOADER_CORE: Lazy<FluentLanguageLoader> = Lazy::new(|| {
let loader: FluentLanguageLoader = fluent_language_loader!();
loader.load_fallback_language(&Localizations).expect("Error while loading fallback language");
@ -20,19 +20,19 @@ pub static LANGUAGE_LOADER: Lazy<FluentLanguageLoader> = Lazy::new(|| {
});
#[macro_export]
macro_rules! fl {
macro_rules! flc {
($message_id:literal) => {{
i18n_embed_fl::fl!($crate::localizer::LANGUAGE_LOADER, $message_id)
i18n_embed_fl::fl!($crate::localizer_core::LANGUAGE_LOADER_CORE, $message_id)
}};
($message_id:literal, $($args:expr),*) => {{
i18n_embed_fl::fl!($crate::localizer::LANGUAGE_LOADER, $message_id, $($args), *)
i18n_embed_fl::fl!($crate::localizer_core::LANGUAGE_LOADER_CORE, $message_id, $($args), *)
}};
}
// Get the `Localizer` to be used for localizing this library.
pub fn localizer() -> Box<dyn Localizer> {
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations))
pub fn localizer_core() -> Box<dyn Localizer> {
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER_CORE, &Localizations))
}
pub fn generate_translation_hashmap(vec: Vec<(&'static str, String)>) -> HashMap<&'static str, String> {
@ -42,3 +42,10 @@ pub fn generate_translation_hashmap(vec: Vec<(&'static str, String)>) -> HashMap
}
hashmap
}
pub fn fnc_get_similarity_very_high() -> String {
flc!("core_similarity_very_high")
}
pub fn fnc_get_similarity_minimal() -> String {
flc!("core_similarity_minimal")
}

View File

@ -24,8 +24,8 @@ use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
use crate::fl;
use crate::localizer::generate_translation_hashmap;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
pub const RAW_IMAGE_EXTENSIONS: [&str; 24] = [
".mrw", ".arw", ".srf", ".sr2", ".mef", ".orf", ".srw", ".erf", ".kdc", ".kdc", ".dcs", ".rw2", ".raf", ".dcr", ".dng", ".pef", ".crw", ".iiq", ".3fr", ".nrw", ".nef", ".mos",
@ -346,7 +346,7 @@ impl SimilarImages {
let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -359,7 +359,7 @@ impl SimilarImages {
let entry_data = match entry {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -369,7 +369,7 @@ impl SimilarImages {
let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -397,7 +397,7 @@ impl SimilarImages {
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
@ -425,7 +425,7 @@ impl SimilarImages {
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
@ -433,7 +433,7 @@ impl SimilarImages {
}
},
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));
@ -1149,17 +1149,17 @@ pub fn get_string_from_similarity(similarity: &Similarity, hash_size: u8) -> Str
// #[cfg(debug_assertions)]
// {
// if *h <= SIMILAR_VALUES[index_preset][0] {
// format!("{} {}", fl!("core_similarity_very_high"), *h)
// format!("{} {}", flc!("core_similarity_very_high"), *h)
// } else if *h <= SIMILAR_VALUES[index_preset][1] {
// format!("{} {}", fl!("core_similarity_high"), *h)
// format!("{} {}", flc!("core_similarity_high"), *h)
// } else if *h <= SIMILAR_VALUES[index_preset][2] {
// format!("{} {}", fl!("core_similarity_medium"), *h)
// format!("{} {}", flc!("core_similarity_medium"), *h)
// } else if *h <= SIMILAR_VALUES[index_preset][3] {
// format!("{} {}", fl!("core_similarity_small"), *h)
// format!("{} {}", flc!("core_similarity_small"), *h)
// } else if *h <= SIMILAR_VALUES[index_preset][4] {
// format!("{} {}", fl!("core_similarity_very_small"), *h)
// format!("{} {}", flc!("core_similarity_very_small"), *h)
// } else if *h <= SIMILAR_VALUES[index_preset][5] {
// format!("{} {}", fl!("core_similarity_minimal"), *h)
// format!("{} {}", flc!("core_similarity_minimal"), *h)
// } else {
// panic!();
// }
@ -1167,17 +1167,17 @@ pub fn get_string_from_similarity(similarity: &Similarity, hash_size: u8) -> Str
// #[cfg(not(debug_assertions))]
{
if *h <= SIMILAR_VALUES[index_preset][0] {
fl!("core_similarity_very_high")
flc!("core_similarity_very_high")
} else if *h <= SIMILAR_VALUES[index_preset][1] {
fl!("core_similarity_high")
flc!("core_similarity_high")
} else if *h <= SIMILAR_VALUES[index_preset][2] {
fl!("core_similarity_medium")
flc!("core_similarity_medium")
} else if *h <= SIMILAR_VALUES[index_preset][3] {
fl!("core_similarity_small")
flc!("core_similarity_small")
} else if *h <= SIMILAR_VALUES[index_preset][4] {
fl!("core_similarity_very_small")
flc!("core_similarity_very_small")
} else if *h <= SIMILAR_VALUES[index_preset][5] {
fl!("core_similarity_minimal")
flc!("core_similarity_minimal")
} else {
panic!();
}

View File

@ -23,8 +23,8 @@ use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
use crate::fl;
use crate::localizer::generate_translation_hashmap;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
use crate::similar_images::VIDEO_FILES_EXTENSIONS;
pub const MAX_TOLERANCE: i32 = 20;
@ -197,8 +197,8 @@ impl SimilarVideos {
/// Public function used by CLI to search for empty folders
pub fn find_similar_videos(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) {
if !check_if_ffmpeg_is_installed() {
self.text_messages.errors.push(fl!("core_ffmpeg_not_found"));
self.text_messages.errors.push(fl!(
self.text_messages.errors.push(flc!("core_ffmpeg_not_found"));
self.text_messages.errors.push(flc!(
"core_ffmpeg_missing_in_snap",
generate_translation_hashmap(vec![("url", "https://github.com/snapcrafters/ffmpeg/issues/73".to_string())])
));
@ -285,7 +285,7 @@ impl SimilarVideos {
let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -298,7 +298,7 @@ impl SimilarVideos {
let entry_data = match entry {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -308,7 +308,7 @@ impl SimilarVideos {
let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -336,7 +336,7 @@ impl SimilarVideos {
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
@ -363,7 +363,7 @@ impl SimilarVideos {
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
@ -371,7 +371,7 @@ impl SimilarVideos {
}
},
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));

View File

@ -16,8 +16,8 @@ use crate::common_directory::Directories;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::*;
use crate::fl;
use crate::localizer::generate_translation_hashmap;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(Debug)]
pub struct ProgressData {
@ -175,7 +175,7 @@ impl Temporary {
let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -188,7 +188,7 @@ impl Temporary {
let entry_data = match entry {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -198,7 +198,7 @@ impl Temporary {
let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t,
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
@ -226,7 +226,7 @@ impl Temporary {
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
@ -267,7 +267,7 @@ impl Temporary {
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
@ -275,7 +275,7 @@ impl Temporary {
}
},
Err(e) => {
warnings.push(fl!(
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));

View File

@ -1,6 +1,6 @@
[package]
name = "czkawka_gui"
version = "3.3.1"
version = "4.0.0"
authors = ["Rafał Mikrut <mikrutrafal@protonmail.com>"]
edition = "2018"
description = "GTK frontend of Czkawka"
@ -9,7 +9,7 @@ homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"
[dependencies]
czkawka_core = { path = "../czkawka_core", version = "3.3.1"}
czkawka_core = { path = "../czkawka_core", version = "4.0.0"}
gdk = "0.14.3"
glib = "0.14.8"

View File

@ -9,5 +9,5 @@ fallback_language = "en"
# (Required) The path to the assets directory.
# The paths inside the assets directory should be structured like so:
# `assets_dir/{language}/{domain}.ftl`
assets_dir = "../i18n"
assets_dir = "i18n"

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Velmi vysoká
core_similarity_high = Vysoká
core_similarity_medium = Střední
core_similarity_small = Malá
core_similarity_very_small = Velmi malá
core_similarity_minimal = Minimální
core_cannot_open_dir = Nelze otevřít dir { $dir }, důvod { $reason }
core_cannot_read_entry_dir = Nelze číst záznam v adresáři { $dir }, důvod { $reason }
core_cannot_read_metadata_dir = Metadata nelze číst v adresáři { $dir }, důvod { $reason }
core_file_not_utf8_name = Soubor { $name } nemá platný název UTF-8 (některé znaky nemusí být zobrazeny)
core_file_modified_before_epoch = Soubor { $name } se zdá být před Unix Epoch upraven
core_folder_modified_before_epoch = Složka { $name } se zdá být upravena před Unixem Epoch
core_file_no_modification_date = Nelze získat datum úpravy ze souboru { $name }, důvod { $reason }
core_folder_no_modification_date = Nelze získat datum úpravy ze složky { $name }, důvod { $reason }
core_missing_no_chosen_included_directory = Musí být uveden alespoň jeden adresář
core_directory_wildcard_no_supported = Adresáře: Zástupné znaky v cestě nejsou podporovány, ignoruji { $path }
core_directory_relative_path = Adresáře: Zástupné znaky v cestě nejsou podporovány, ignoruji { $path }
core_directory_must_exists = Adresáře: Poskytnutá cesta ke složce musí skončit, ignoruji { $path }
core_directory_must_be_directory = Adresáře: Poskytnutá cesta musí směřovat do adresáře, ignoruje { $path }
core_included_directory_zero_valid_directories = CHYBA zahrnutí adresáře: Nenalezena ani jedna správná cesta k zahrnutí, která je vyžadována
core_excluded_directory_pointless_slash = Adresáře: Vyloučení / je bezúčelné, protože to znamená, že žádné soubory nebudou naskenovány
core_directory_overlap = Adresáře: Všechny adresáře pro vyhledávání se překrývají s vyloučením adresářů
core_ffmpeg_not_found = Nelze najít správnou instalaci FFmpeg
core_ffmpeg_missing_in_snap = Podobná videa v současné době nefungují se snapem, pokud chcete nápovědu sledovat - { $url }
# Window titles
window_settings_title = Možnosti
window_main_title = Czkawka (Škytavka)

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Sehr Hoch
core_similarity_high = Hoch
core_similarity_medium = Mittel
core_similarity_small = Klein
core_similarity_very_small = Sehr klein
core_similarity_minimal = Minimale
core_cannot_open_dir = Verzeichnis { $dir } kann nicht geöffnet werden, Grund { $reason }
core_cannot_read_entry_dir = Kann Eintrag in Verzeichnis { $dir } nicht lesen, Grund { $reason }
core_cannot_read_metadata_dir = Metadaten können in Verzeichnis { $dir } nicht gelesen werden, Grund { $reason }
core_file_not_utf8_name = Datei { $name } hat keinen gültigen UTF-8-Namen (einige Zeichen dürfen nicht angezeigt werden)
core_file_modified_before_epoch = Datei { $name } scheint vor der Unix-Epoche geändert zu werden
core_folder_modified_before_epoch = Ordner { $name } scheint vor der Unix-Epoche geändert zu werden
core_file_no_modification_date = Konnte das Änderungsdatum von Datei { $name } nicht abrufen, Grund { $reason }
core_folder_no_modification_date = Konnte das Änderungsdatum aus dem Ordner { $name } nicht abrufen, Grund { $reason }
core_missing_no_chosen_included_directory = Mindestens ein Verzeichnis muss angegeben werden
core_directory_wildcard_no_supported = Verzeichnisse: Wildcards im Pfad werden nicht unterstützt, { $path } wird ignoriert
core_directory_relative_path = Verzeichnisse: Relativer Pfad wird nicht unterstützt, { $path } wird ignoriert
core_directory_must_exists = Verzeichnisse: Der angegebene Ordnerpfad muss beendet werden, { $path } wird ignoriert
core_directory_must_be_directory = Verzeichnisse: Der angegebene Pfad muss auf das Verzeichnis zeigen und { $path } ignorieren
core_included_directory_zero_valid_directories = Inklusive Verzeichnis-FEHLER: Nicht einmal einen korrekten Pfad zu inkludiert, der erforderlich ist
core_excluded_directory_pointless_slash = Verzeichnisse: Ausschließen / ist sinnlos, weil es bedeutet, dass keine Dateien gescannt werden
core_directory_overlap = Verzeichnisse: Alle Verzeichnisse zum Suchen von Überlappungen mit ausgeschlossenen Verzeichnissen
core_ffmpeg_not_found = Keine richtige Installation von FFmpeg gefunden
core_ffmpeg_missing_in_snap = Ähnliche Videos funktionieren derzeit nicht mit Snap, wenn du Hilfe möchtest - { $url }
# Window titles
window_settings_title = Optionen
window_main_title = Czkawka (Schluckauf)

View File

@ -1,32 +1,3 @@
# Core
core_similarity_very_high = Very High
core_similarity_high = High
core_similarity_medium = Medium
core_similarity_small = Small
core_similarity_very_small = Very Small
core_similarity_minimal = Minimal
core_cannot_open_dir = Cannot open dir {$dir}, reason {$reason}
core_cannot_read_entry_dir = Cannot read entry in dir {$dir}, reason {$reason}
core_cannot_read_metadata_dir = Cannot read metadata in dir {$dir}, reason {$reason}
core_file_not_utf8_name = File {$name} does not have a valid UTF-8 name (some characters may not be shown)
core_file_modified_before_epoch = File {$name} seems to be modified before Unix Epoch
core_folder_modified_before_epoch = Folder {$name} seems to be modified before Unix Epoch
core_file_no_modification_date = Unable to get modification date from file {$name}, reason {$reason}
core_folder_no_modification_date = Unable to get modification date from folder {$name}, reason {$reason}
core_missing_no_chosen_included_directory = At least one directory must be provided
core_directory_wildcard_no_supported = Directories: Wildcards in path are not supported, ignoring { $path }
core_directory_relative_path = Directories: Relative path are not supported, ignoring { $path }
core_directory_must_exists = Directories: Provided folder path must exist, ignoring { $path }
core_directory_must_be_directory = Directories: Provided path must point at the directory, ignoring { $path }
core_included_directory_zero_valid_directories = Included Directory ERROR: Not found even one correct path to included which is required
core_excluded_directory_pointless_slash = Directories: Excluding / is pointless, because it means that no files will be scanned
core_directory_overlap = Directories: All directories to search overlaps with excluded directories
core_ffmpeg_not_found = Cannot find proper installation of FFmpeg
core_ffmpeg_missing_in_snap = Similar Videos don't work currently with snap, if you want help look at - { $url }
# Window titles
window_settings_title = Settings
window_main_title = Czkawka (Hiccup)

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Muy alta
core_similarity_high = Alta
core_similarity_medium = Medio
core_similarity_small = Pequeño
core_similarity_very_small = Muy pequeño
core_similarity_minimal = Mínimo
core_cannot_open_dir = No se puede abrir el directorio { $dir }, razón { $reason }
core_cannot_read_entry_dir = No se puede leer la entrada en directorio { $dir }, razón { $reason }
core_cannot_read_metadata_dir = No se pueden leer metadatos en el directorio { $dir }, razón { $reason }
core_file_not_utf8_name = El archivo { $name } no tiene un nombre UTF-8 válido (algunos caracteres pueden no mostrarse)
core_file_modified_before_epoch = El archivo { $name } parece ser modificado antes de Unix Epoch
core_folder_modified_before_epoch = La carpeta { $name } parece ser modificada antes del Epoch Unix
core_file_no_modification_date = No se puede obtener la fecha de modificación del archivo { $name }, razón { $reason }
core_folder_no_modification_date = No se puede obtener la fecha de modificación de la carpeta { $name }, razón { $reason }
core_missing_no_chosen_included_directory = Debe proporcionarse al menos un directorio
core_directory_wildcard_no_supported = Directorios: Los comodines en la ruta no son compatibles, ignorando { $path }
core_directory_relative_path = Directorios: No se admite la ruta relativa, ignorando { $path }
core_directory_must_exists = Directorios: La ruta de la carpeta debe salir, ignorando { $path }
core_directory_must_be_directory = Directorios: La ruta proporcionada debe apuntar al directorio, ignorando { $path }
core_included_directory_zero_valid_directories = ERROR del directorio incluido: No se ha encontrado ni una ruta correcta a incluida que es necesaria
core_excluded_directory_pointless_slash = Directorios: Excluyendo / es inútil, ya que no se analizarán archivos
core_directory_overlap = Directorios: Todos los directorios para buscar superposiciones con directorios excluidos
core_ffmpeg_not_found = No se puede encontrar la instalación correcta de FFmpeg
core_ffmpeg_missing_in_snap = Los Videos Similares no funcionan actualmente con el snap, si quieres ayuda mira - { $url }
# Window titles
window_settings_title = Opciones
window_main_title = Czkawka (Hipo)

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Très haute
core_similarity_high = Haute
core_similarity_medium = Moyenne
core_similarity_small = Basse
core_similarity_very_small = Très basse
core_similarity_minimal = Minimale
core_cannot_open_dir = Impossible douvrir le répertoire { $dir }, raison: { $reason }
core_cannot_read_entry_dir = Impossible de lire l'entrée dans le répertoire { $dir }, raison: { $reason }
core_cannot_read_metadata_dir = Impossible de lire les métadonnées dans le répertoire { $dir }, raison: { $reason }
core_file_not_utf8_name = Le fichier { $name } n'a pas de nom UTF-8 valide (certains caractères ne peuvent pas être affichés)
core_file_modified_before_epoch = Le fichier { $name } semble avoir été modifié avant l'époque Unix
core_folder_modified_before_epoch = Le dossier { $name } semble avoir été modifié avant l'époque Unix
core_file_no_modification_date = Impossible d'obtenir la date de modification du fichier { $name }, raison: { $reason }
core_folder_no_modification_date = Impossible d'obtenir la date de modification du dossier { $name }, raison: { $reason }
core_missing_no_chosen_included_directory = Au moins un répertoire doit être fourni
core_directory_wildcard_no_supported = Répertoires : Les jokers dans le chemin ne sont pas pris en charge, ignorant { $path }
core_directory_relative_path = Répertoires : Le chemin relatif n'est pas pris en charge, ignorant { $path }
core_directory_must_exists = Répertoires : Le chemin du dossier fourni doit se terminer, ignorant { $path }
core_directory_must_be_directory = Répertoires : Le chemin fourni doit pointer dans le répertoire, { $path }
core_included_directory_zero_valid_directories = ERREUR de répertoire inclus : Aucun chemin n'a été trouvé, même un chemin correct à inclure qui est requis
core_excluded_directory_pointless_slash = Répertoires: Exclure / est inutile, car cela signifie qu'aucun fichier ne sera scanné
core_directory_overlap = Répertoires : Tous les répertoires pour rechercher des chevauchements avec des répertoires exclus
core_ffmpeg_not_found = Impossible de trouver une installation correcte de FFmpeg
core_ffmpeg_missing_in_snap = Les vidéos similaires ne fonctionnent pas actuellement avec un instantané, si vous voulez de l'aide - { $url }
# Window titles
window_settings_title = Options
window_main_title = Czkawka (Hoquet)

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Altissima
core_similarity_high = Alta
core_similarity_medium = Media
core_similarity_small = Piccola
core_similarity_very_small = Piccolissima
core_similarity_minimal = Minima
core_cannot_open_dir = Impossibile aprire cartella { $dir }, motivo { $reason }
core_cannot_read_entry_dir = Impossibile leggere elemento nella cartella { $dir }, ragione { $reason }
core_cannot_read_metadata_dir = Impossibile leggere metadati nella cartella { $dir }, ragione { $reason }
core_file_not_utf8_name = Il file { $name } non ha un nome UTF-8 valido (alcuni caratteri potrebbero non essere mostrati)
core_file_modified_before_epoch = Il file { $name } sembra essere stato modificato prima dell'Epoca Unix
core_folder_modified_before_epoch = La cartella { $name } sembra essere stato modificata prima dell'Epoca Unix
core_file_no_modification_date = Impossibile recuperare data di modifica dal file { $name }, ragione { $reason }
core_folder_no_modification_date = Impossibile recuperare data di modifica dalla cartella { $name }, ragione { $reason }
core_missing_no_chosen_included_directory = Almeno una directory deve essere fornita
core_directory_wildcard_no_supported = Cartelle: i caratteri jolly nel percorso non sono supportati, ignorando { $path }
core_directory_relative_path = Directories: Il percorso relativo non è supportato, ignorando { $path }
core_directory_must_exists = Directories: Il percorso della cartella fornito deve uscire, ignorando { $path }
core_directory_must_be_directory = Directories: Il percorso fornito deve puntare alla directory, ignorando { $path }
core_included_directory_zero_valid_directories = ERRORE Directory incluso: Non trovato nemmeno un percorso corretto incluso che è richiesto
core_excluded_directory_pointless_slash = Cartelle: Escludere / è inutile, perché significa che nessun file verrà scansionato
core_directory_overlap = Directories: Tutte le directory per cercare sovrapposizioni con directory escluse
core_ffmpeg_not_found = Impossibile trovare la corretta installazione di FFmpeg
core_ffmpeg_missing_in_snap = Video simili non funzionano attualmente con snap, se si desidera aiutare a guardare - { $url }
# Window titles
window_settings_title = Impostazioni
window_main_title = Singhiozzo

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = 非常に高い
core_similarity_high = 高い
core_similarity_medium = ミディアム
core_similarity_small = 小
core_similarity_very_small = 非常に小さい
core_similarity_minimal = 最小
core_cannot_open_dir = ディレクトリを開くことができません { $dir }、理由 { $reason }
core_cannot_read_entry_dir = Dir { $dir } でエントリを読み込めません、理由 { $reason }
core_cannot_read_metadata_dir = Dir { $dir } でメタデータを読み込めません、理由 { $reason }
core_file_not_utf8_name = ファイル { $name } に有効な UTF-8 名がありません (一部の文字は表示されない可能性があります)
core_file_modified_before_epoch = ファイル { $name } は Unix Epoch より前に変更されているようです
core_folder_modified_before_epoch = フォルダ { $name } は、Unix Epoch の前に変更されているようです
core_file_no_modification_date = ファイル { $name } から変更日を取得できません、理由 { $reason }
core_folder_no_modification_date = フォルダ { $name } から変更日を取得できません、理由 { $reason }
core_missing_no_chosen_included_directory = 少なくとも 1 つのディレクトリを指定する必要があります。
core_directory_wildcard_no_supported = ディレクトリ: パス内のワイルドカードはサポートされていません。 { $path } を無視してください
core_directory_relative_path = ディレクトリ: 相対パスはサポートされていません。 { $path } を無視してください
core_directory_must_exists = ディレクトリ: 指定されたフォルダパスは、 { $path } を無視して終了する必要があります
core_directory_must_be_directory = ディレクトリ: 指定されたパスはディレクトリを指す必要があります。 { $path } を無視します
core_included_directory_zero_valid_directories = 含まれるディレクトリエラー: 必須の正しいパスが1つも見つかりません
core_excluded_directory_pointless_slash = ディレクトリ: ファイルがスキャンされないことを意味するため、除外/無意味です
core_directory_overlap = ディレクトリ: 除外されたディレクトリとオーバーラップを検索するすべてのディレクトリ
core_ffmpeg_not_found = 適切なFFmpegのインストールが見つかりません
core_ffmpeg_missing_in_snap = ヘルプを見たい場合は、現在同様のビデオはスナップでは動作しません - { $url }
# Window titles
window_settings_title = オプション
window_main_title = Czkawka (しゃっくり)

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Bardzo Duże
core_similarity_high = Duże
core_similarity_medium = Średnie
core_similarity_small = Małe
core_similarity_very_small = Bardzo Małe
core_similarity_minimal = Minimalne
core_cannot_open_dir = Nie można otworzyć folderu { $dir }, powód { $reason }
core_cannot_read_entry_dir = Nie można odczytać danych z folderu { $dir }, powód { $reason }
core_cannot_read_metadata_dir = Nie można odczytać metadanych folderu { $dir }, powód { $reason }
core_file_not_utf8_name = Plik { $name } nie posiada nazwy zakodowanej za pomocą UTF-8(niektóre znaki mogą się nie wyświetlać)
core_file_modified_before_epoch = Plik { $name } ma datę modyfikacji sprzed epoki unixa
core_folder_modified_before_epoch = Folder { $name } ma datę modyfikacji sprzed epoki unixa
core_file_no_modification_date = Nie udało się pobrać daty modyfikacji z pliku { $name }, powód { $reason }
core_folder_no_modification_date = Nie udało się pobrać daty modyfikacji z folderu { $name }, powód { $reason }
core_missing_no_chosen_included_directory = Należy podać co najmniej jeden katalog
core_directory_wildcard_no_supported = Katalogi: Wildcard na ścieżce nie są obsługiwane, ignorowanie { $path }
core_directory_relative_path = Katalogi: Ścieżka względna nie jest wspierana, ignorowanie { $path }
core_directory_must_exists = Katalogi: Podana ścieżka do folderu musi istnieć, ignorowanie { $path }
core_directory_must_be_directory = Katalogi: Podana ścieżka musi wskazywać na katalog, ignorowanie { $path }
core_included_directory_zero_valid_directories = Błąd katalogów do przeszukiwania: Nie znaleziono nawet jednej poprawnej ścieżki do przeszukania
core_excluded_directory_pointless_slash = Katalogi: Wykluczanie folderu / jest bezcelowe, ponieważ oznacza to, że żadne pliki nie zostaną sprawdzone
core_directory_overlap = Katalogi: Wszystkie katalogi do wyszukiwania pokrywają się z wykluczonymi
core_ffmpeg_not_found = Nie można odnaleźć poprawnej instalacji FFmpeg
core_ffmpeg_missing_in_snap = Wyszukiwanie podobnych filmów nie działa obecnie w snapach, jeśli chcesz pomóc spójrz na - { $url }
# Window titles
window_settings_title = Opcje
window_main_title = Czkawka

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Muito alto
core_similarity_high = Alto
core_similarity_medium = Média
core_similarity_small = Pequeno
core_similarity_very_small = Muito Pequeno
core_similarity_minimal = Mínimo
core_cannot_open_dir = Não é possível abrir o diretório { $dir }, razão { $reason }
core_cannot_read_entry_dir = Não é possível ler a entrada no diretório { $dir }, razão { $reason }
core_cannot_read_metadata_dir = Não é possível ler os metadados no diretório { $dir }, razão { $reason }
core_file_not_utf8_name = Arquivo { $name } não tem nome UTF-8 válido (alguns caracteres não podem ser exibidos)
core_file_modified_before_epoch = Arquivo { $name } parece ser modificado antes do Epoch Unix
core_folder_modified_before_epoch = A pasta { $name } parece ser modificada antes do Epoch Unix
core_file_no_modification_date = Não foi possível obter a data de modificação do arquivo { $name }, motivo { $reason }
core_folder_no_modification_date = Não foi possível obter a data de modificação da pasta { $name }, motivo { $reason }
core_missing_no_chosen_included_directory = Pelo menos um diretório deve ser fornecido
core_directory_wildcard_no_supported = Directorias: Caracteres curinga no caminho não são suportados, ignorando { $path }
core_directory_relative_path = Directorias: Caminho relativo não são suportados, ignorando { $path }
core_directory_must_exists = Directórios: Caminho da pasta fornecida deve sair, ignorando { $path }
core_directory_must_be_directory = Diretórios: Caminho fornecido deve apontar para o diretório, ignorando { $path }
core_included_directory_zero_valid_directories = ERRO do Diretório incluído: Não foi encontrado nenhum caminho correto que é necessário incluir
core_excluded_directory_pointless_slash = Directorias: Excluir / não faz sentido, porque significa que nenhum arquivo será escaneado
core_directory_overlap = Diretórios: Todos os diretórios para pesquisar sobreposições com diretórios excluídos
core_ffmpeg_not_found = Instalação adequada do FFmpeg não encontrada
core_ffmpeg_missing_in_snap = Vídeos similares não funcionam atualmente com o snap, se você quiser ajudar a olhar - { $url }
# Window titles
window_settings_title = Opções
window_main_title = Czkawka (Soluço)

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Очень высокий
core_similarity_high = Высокий
core_similarity_medium = Средний
core_similarity_small = Маленький
core_similarity_very_small = Очень маленький
core_similarity_minimal = Минимальный
core_cannot_open_dir = Невозможно открыть каталог { $dir }, причина { $reason }
core_cannot_read_entry_dir = Невозможно прочитать запись в директории { $dir }, причина { $reason }
core_cannot_read_metadata_dir = Невозможно прочитать метаданные в директории { $dir }, причина { $reason }
core_file_not_utf8_name = У файла { $name } неверное имя UTF-8 (некоторые символы не могут быть показаны)
core_file_modified_before_epoch = Файл { $name } может быть изменен до начала эпохи Unix
core_folder_modified_before_epoch = Папка { $name } изменяется до начала эпохи Unix
core_file_no_modification_date = Не удается получить дату изменения из файла { $name }, причина { $reason }
core_folder_no_modification_date = Не удается получить дату изменения из папки { $name }, причина { $reason }
core_missing_no_chosen_included_directory = Должен быть указан хотя бы один каталог
core_directory_wildcard_no_supported = Директории: Не поддерживаются шаблоны в директории, игнорируется { $path }
core_directory_relative_path = Директории: Относительный путь не поддерживается, игнорируется { $path }
core_directory_must_exists = Директории: Указанный путь к папке должен быть закрыт, игнорируется { $path }
core_directory_must_be_directory = Директории: Указанный путь должен указывать на директорию, игнорируя { $path }
core_included_directory_zero_valid_directories = Включенный каталог ОШИБКА: Не найден даже один правильный путь к включённому которому требуется
core_excluded_directory_pointless_slash = Директории: Исключение / бессмысленно, потому что ни один файл не будет просканирован
core_directory_overlap = Каталоги: Все директории для поиска совпадают с исключенными каталогами
core_ffmpeg_not_found = Не удается найти надлежащую установку FFmpeg
core_ffmpeg_missing_in_snap = Похожие видео не работают в данный момент, если вы хотите помочь посмотреть - { $url }
# Window titles
window_settings_title = Опции
window_main_title = Czkawka (икота)

View File

@ -1,28 +1,3 @@
# Core
core_similarity_very_high = Дуже високий
core_similarity_high = Високий
core_similarity_medium = Медіум
core_similarity_small = Маленький
core_similarity_very_small = Дуже малий
core_similarity_minimal = Мінімальні
core_cannot_open_dir = Не вдалося відкрити папку { $dir }, причина { $reason }
core_cannot_read_entry_dir = Не вдалося прочитати запис в папці { $dir }, причина { $reason }
core_cannot_read_metadata_dir = Не вдалося прочитати метадані в папці { $dir }, причина { $reason }
core_file_not_utf8_name = Файл { $name } не має припустимого імені UTF-8 (деякі символи не можуть бути показані)
core_file_modified_before_epoch = Файл { $name } Схоже, змінено перед Unix Epoch
core_folder_modified_before_epoch = Папка { $name } здається змінена до Unix Epoch
core_file_no_modification_date = Не вдалося отримати дату модифікації з файлу { $name }, причина { $reason }
core_folder_no_modification_date = Не вдалося отримати дату модифікації з папки { $name }, причина { $reason }
core_missing_no_chosen_included_directory = Необхідно вказати принаймні один каталог
core_directory_wildcard_no_supported = Директорія: Шаблони в шляху не підтримуються, ігноруючи { $path }
core_directory_relative_path = Каталог: Відносний шлях не підтримується, ігноруючи { $path }
core_directory_must_exists = Каталог: Наданий шлях до папки повинен вийти, ігноруючи { $path }
core_directory_must_be_directory = Каталог: Наданий шлях повинен вказувати на каталог, ігноруючи { $path }
core_included_directory_zero_valid_directories = Включена помилка в каталозі: не знайдено навіть один правильний шлях до включеного, який є обов'язковим
core_excluded_directory_pointless_slash = Теки: виключення / без урахування безточних, тому що це означає, що файли не будуть скановані
core_directory_overlap = Каталоги: Усі каталоги для пошуку перетинаються з виключеними каталогами
core_ffmpeg_not_found = Не вдалося знайти правильне встановлення FFmpeg
core_ffmpeg_missing_in_snap = Подібні відео в даний час не працюють з знімком, якщо ви хочете, щоб допомогти вам переглянути - { $url }
# Window titles
window_settings_title = Опції
window_main_title = Czkawka (гикавка)

View File

@ -12,13 +12,13 @@ use czkawka_core::common_dir_traversal::CheckingMethod;
use czkawka_core::same_music::MusicSimilarity;
use czkawka_core::similar_images;
use crate::fl;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_combo_box::IMAGES_HASH_SIZE_COMBO_BOX;
use crate::help_functions::*;
use crate::notebook_enums::*;
use crate::opening_selecting_records::*;
use czkawka_core::localizer::generate_translation_hashmap;
use czkawka_core::localizer_core::generate_translation_hashmap;
pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<Message>) {
let combo_box_image_hash_size = gui_data.main_notebook.combo_box_image_hash_size.clone();
@ -76,7 +76,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
match msg {
Message::Duplicates(df) => {
if df.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
if df.get_use_reference() {
tree_view_duplicate_finder.selection().set_select_function(Some(Box::new(select_function_always_true)));
@ -97,7 +97,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
// duplicates_size = 0;
duplicates_group = information.number_of_groups_by_name;
entry_info.set_text(
fl!(
flg!(
"compute_found_duplicates_name",
generate_translation_hashmap(vec![("number_files", duplicates_number.to_string()), ("number_groups", duplicates_group.to_string())])
)
@ -109,7 +109,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
duplicates_size = information.lost_space_by_hash;
duplicates_group = information.number_of_groups_by_hash;
entry_info.set_text(
fl!(
flg!(
"compute_found_duplicates_hash_size",
generate_translation_hashmap(vec![
("number_files", duplicates_number.to_string()),
@ -125,7 +125,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
duplicates_size = information.lost_space_by_size;
duplicates_group = information.number_of_groups_by_size;
entry_info.set_text(
fl!(
flg!(
"compute_found_duplicates_hash_size",
generate_translation_hashmap(vec![
("number_files", duplicates_number.to_string()),
@ -521,7 +521,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::EmptyFolders(ef) => {
if ef.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
let information = ef.get_information();
let text_messages = ef.get_text_messages();
@ -529,7 +529,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let empty_folder_number: usize = information.number_of_empty_folders;
entry_info.set_text(
fl!(
flg!(
"compute_found_empty_folders",
generate_translation_hashmap(vec![("number_files", empty_folder_number.to_string()),])
)
@ -586,7 +586,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::EmptyFiles(vf) => {
if vf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
let information = vf.get_information();
let text_messages = vf.get_text_messages();
@ -594,7 +594,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let empty_files_number: usize = information.number_of_empty_files;
entry_info.set_text(
fl!(
flg!(
"compute_found_empty_files",
generate_translation_hashmap(vec![("number_files", empty_files_number.to_string()),])
)
@ -652,7 +652,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::BigFiles(bf) => {
if bf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
let information = bf.get_information();
let text_messages = bf.get_text_messages();
@ -660,7 +660,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let biggest_files_number: usize = information.number_of_real_files;
entry_info.set_text(
fl!(
flg!(
"compute_found_big_files",
generate_translation_hashmap(vec![("number_files", biggest_files_number.to_string()),])
)
@ -720,14 +720,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::Temporary(tf) => {
if tf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
let information = tf.get_information();
let text_messages = tf.get_text_messages();
let temporary_files_number: usize = information.number_of_temporary_files;
entry_info.set_text(
fl!(
flg!(
"compute_found_temporary_files",
generate_translation_hashmap(vec![("number_files", temporary_files_number.to_string()),])
)
@ -785,7 +785,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::SimilarImages(sf) => {
if sf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
if sf.get_use_reference() {
tree_view_similar_images_finder.selection().set_select_function(Some(Box::new(select_function_always_true)));
@ -800,7 +800,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let found_any_duplicates = information.number_of_duplicates > 0;
entry_info.set_text(
fl!(
flg!(
"compute_found_images",
generate_translation_hashmap(vec![
("number_files", information.number_of_duplicates.to_string()),
@ -969,7 +969,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::SimilarVideos(ff) => {
if ff.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
if ff.get_use_reference() {
tree_view_similar_videos_finder.selection().set_select_function(Some(Box::new(select_function_always_true)));
@ -983,7 +983,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let found_any_duplicates = information.number_of_duplicates > 0;
entry_info.set_text(
fl!(
flg!(
"compute_found_videos",
generate_translation_hashmap(vec![
("number_files", information.number_of_duplicates.to_string()),
@ -1138,7 +1138,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::SameMusic(mf) => {
if mf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
if mf.get_use_reference() {
tree_view_same_music_finder.selection().set_select_function(Some(Box::new(select_function_always_true)));
@ -1152,7 +1152,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let same_music_number: usize = information.number_of_duplicates;
entry_info.set_text(
fl!(
flg!(
"compute_found_music",
generate_translation_hashmap(vec![
("number_files", information.number_of_duplicates.to_string()),
@ -1360,7 +1360,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::InvalidSymlinks(ifs) => {
if ifs.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
let information = ifs.get_information();
let text_messages = ifs.get_text_messages();
@ -1368,7 +1368,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let invalid_symlinks: usize = information.number_of_invalid_symlinks;
entry_info.set_text(
fl!(
flg!(
"compute_found_invalid_symlinks",
generate_translation_hashmap(vec![("number_files", invalid_symlinks.to_string()),])
)
@ -1433,7 +1433,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
}
Message::BrokenFiles(br) => {
if br.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user"));
entry_info.set_text(&flg!("compute_stopped_by_user"));
} else {
let information = br.get_information();
let text_messages = br.get_text_messages();
@ -1441,7 +1441,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let broken_files_number: usize = information.number_of_broken_files;
entry_info.set_text(
fl!(
flg!(
"compute_found_broken_files",
generate_translation_hashmap(vec![("number_files", broken_files_number.to_string()),])
)

View File

@ -1,5 +1,5 @@
use crate::flg;
use czkawka_core::common::get_dynamic_image_from_raw_image;
use czkawka_core::fl;
use czkawka_core::similar_images::RAW_IMAGE_EXTENSIONS;
use gtk::prelude::*;
use gtk::{CheckButton, Image, ListStore, Orientation, ScrolledWindow, TreeIter, TreeModel, TreePath, TreeSelection};
@ -13,7 +13,7 @@ use crate::help_functions::{
count_number_of_groups, get_full_name_from_path_name, get_image_path_temporary, get_max_file_name, resize_dynamic_image_dimension, NotebookObject, HEADER_ROW_COLOR,
NOTEBOOKS_INFOS,
};
use crate::localizer::generate_translation_hashmap;
use crate::localizer_core::generate_translation_hashmap;
const BIG_PREVIEW_SIZE: u32 = 600;
const SMALL_PREVIEW_SIZE: u32 = 100;
@ -296,7 +296,7 @@ fn populate_groups_at_start(
check_button_right_preview_text.set_label(&format!("2. {}", get_max_file_name(&cache_all_images[1].0, 70)));
label_group_info.set_text(
fl!(
flg!(
"compare_groups_number",
generate_translation_hashmap(vec![
("current_group", current_group.to_string()),
@ -488,9 +488,9 @@ fn populate_similar_scrolled_view(
let smaller_box = gtk::Box::new(Orientation::Horizontal, 2);
let button_left = gtk::Button::builder().label(&fl!("compare_move_left_button")).build();
let button_left = gtk::Button::builder().label(&flg!("compare_move_left_button")).build();
let label = gtk::Label::builder().label(&(number + 1).to_string()).build();
let button_right = gtk::Button::builder().label(&fl!("compare_move_right_button")).build();
let button_right = gtk::Button::builder().label(&flg!("compare_move_right_button")).build();
let image_compare_left = image_compare_left.clone();
let image_compare_right = image_compare_right.clone();

View File

@ -5,11 +5,11 @@ use std::fs::Metadata;
use gtk::prelude::*;
use gtk::{Align, CheckButton, Dialog, ResponseType, TextView};
use czkawka_core::fl;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*;
use crate::localizer::generate_translation_hashmap;
use crate::localizer_core::generate_translation_hashmap;
use crate::notebook_enums::*;
// TODO add support for checking if really symlink doesn't point to correct directory/file
@ -140,22 +140,22 @@ pub async fn check_if_can_delete_files(
}
fn create_dialog_ask_for_deletion(window_main: &gtk::Window, number_of_selected_items: u64, number_of_selected_groups: u64) -> (Dialog, CheckButton) {
let dialog = gtk::Dialog::builder().title(&fl!("delete_title_dialog")).transient_for(window_main).modal(true).build();
let button_ok = dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel);
let dialog = gtk::Dialog::builder().title(&flg!("delete_title_dialog")).transient_for(window_main).modal(true).build();
let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let label: gtk::Label = gtk::Label::new(Some(&fl!("delete_question_label")));
let label: gtk::Label = gtk::Label::new(Some(&flg!("delete_question_label")));
let label2: gtk::Label = match number_of_selected_groups {
0 => gtk::Label::new(Some(&fl!(
0 => gtk::Label::new(Some(&flg!(
"delete_items_label",
generate_translation_hashmap(vec![("items", number_of_selected_items.to_string())])
))),
_ => gtk::Label::new(Some(&fl!(
_ => gtk::Label::new(Some(&flg!(
"delete_items_groups_label",
generate_translation_hashmap(vec![("items", number_of_selected_items.to_string()), ("groups", number_of_selected_groups.to_string())])
))),
};
let check_button: gtk::CheckButton = gtk::CheckButton::with_label(&fl!("dialogs_ask_next_time"));
let check_button: gtk::CheckButton = gtk::CheckButton::with_label(&flg!("dialogs_ask_next_time"));
check_button.set_active(true);
check_button.set_halign(Align::Center);
@ -174,16 +174,16 @@ fn create_dialog_ask_for_deletion(window_main: &gtk::Window, number_of_selected_
fn create_dialog_group_deletion(window_main: &gtk::Window) -> (Dialog, CheckButton) {
let dialog = gtk::Dialog::builder()
.title(&fl!("delete_all_files_in_group_title"))
.title(&flg!("delete_all_files_in_group_title"))
.transient_for(window_main)
.modal(true)
.build();
let button_ok = dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel);
let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let label: gtk::Label = gtk::Label::new(Some(&fl!("delete_all_files_in_group_label1")));
let label2: gtk::Label = gtk::Label::new(Some(&fl!("delete_all_files_in_group_label2")));
let check_button: gtk::CheckButton = gtk::CheckButton::with_label(&fl!("dialogs_ask_next_time"));
let label: gtk::Label = gtk::Label::new(Some(&flg!("delete_all_files_in_group_label1")));
let label2: gtk::Label = gtk::Label::new(Some(&flg!("delete_all_files_in_group_label2")));
let check_button: gtk::CheckButton = gtk::CheckButton::with_label(&flg!("dialogs_ask_next_time"));
check_button.set_active(true);
check_button.set_halign(Align::Center);
@ -364,7 +364,7 @@ pub fn empty_folder_remover(
}
}
if error_happened {
messages += &fl!(
messages += &flg!(
"delete_folder_failed",
generate_translation_hashmap(vec![("dir", get_full_name_from_path_name(&path, &name))])
);
@ -421,7 +421,7 @@ pub fn basic_remove(
}
Err(e) => {
messages += fl!(
messages += flg!(
"delete_file_failed",
generate_translation_hashmap(vec![("name", get_full_name_from_path_name(&path, &name)), ("reason", e.to_string())])
)
@ -435,7 +435,7 @@ pub fn basic_remove(
model.remove(&iter);
}
Err(e) => {
messages += fl!(
messages += flg!(
"delete_file_failed",
generate_translation_hashmap(vec![("name", get_full_name_from_path_name(&path, &name)), ("reason", e.to_string())])
)
@ -510,7 +510,7 @@ pub fn tree_remove(
for file_name in vec_file_name {
if !use_trash {
if let Err(e) = fs::remove_file(get_full_name_from_path_name(&path, &file_name)) {
messages += fl!(
messages += flg!(
"delete_file_failed",
generate_translation_hashmap(vec![("name", get_full_name_from_path_name(&path, &file_name)), ("reason", e.to_string())])
)
@ -518,7 +518,7 @@ pub fn tree_remove(
messages += "\n";
}
} else if let Err(e) = trash::delete(get_full_name_from_path_name(&path, &file_name)) {
messages += fl!(
messages += flg!(
"delete_file_failed",
generate_translation_hashmap(vec![("name", get_full_name_from_path_name(&path, &file_name)), ("reason", e.to_string())])
)

View File

@ -4,12 +4,12 @@ use std::path::PathBuf;
use gtk::prelude::*;
use gtk::{Align, CheckButton, Dialog, ResponseType, TextView, TreeIter, TreePath};
use crate::flg;
use czkawka_core::duplicate::make_hard_link;
use czkawka_core::fl;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*;
use crate::localizer::generate_translation_hashmap;
use crate::localizer_core::generate_translation_hashmap;
use crate::notebook_enums::*;
pub fn connect_button_hardlink_symlink(gui_data: &GuiData) {
@ -196,7 +196,7 @@ pub fn hardlink_symlink(
for symhardlink_data in vec_symhardlink_data {
for file_to_hardlink in symhardlink_data.files_to_symhardlink {
if let Err(e) = make_hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) {
add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", fl!("hardlink_failed"), file_to_hardlink, e).as_str());
add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str());
continue;
}
}
@ -207,7 +207,7 @@ pub fn hardlink_symlink(
if let Err(e) = fs::remove_file(&file_to_symlink) {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"delete_file_failed",
generate_translation_hashmap(vec![("name", file_to_symlink.to_string()), ("reason", e.to_string())])
)
@ -221,7 +221,7 @@ pub fn hardlink_symlink(
if let Err(e) = std::os::unix::fs::symlink(&symhardlink_data.original_data, &file_to_symlink) {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"delete_file_failed",
generate_translation_hashmap(vec![("name", file_to_symlink.to_string()), ("reason", e.to_string())])
)
@ -235,7 +235,7 @@ pub fn hardlink_symlink(
if let Err(e) = std::os::windows::fs::symlink_file(&symhardlink_data.original_data, &file_to_symlink) {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"delete_file_failed",
generate_translation_hashmap(vec![("name", file_to_symlink.to_string()), ("reason", e.to_string())])
)
@ -256,16 +256,16 @@ pub fn hardlink_symlink(
fn create_dialog_non_group(window_main: &gtk::Window) -> Dialog {
let dialog = gtk::Dialog::builder()
.title(&fl!("hard_sym_invalid_selection_title_dialog"))
.title(&flg!("hard_sym_invalid_selection_title_dialog"))
.transient_for(window_main)
.modal(true)
.build();
let button_ok = dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel);
let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let label: gtk::Label = gtk::Label::new(Some(&fl!("hard_sym_invalid_selection_label_1")));
let label2: gtk::Label = gtk::Label::new(Some(&fl!("hard_sym_invalid_selection_label_2")));
let label3: gtk::Label = gtk::Label::new(Some(&fl!("hard_sym_invalid_selection_label_3")));
let label: gtk::Label = gtk::Label::new(Some(&flg!("hard_sym_invalid_selection_label_1")));
let label2: gtk::Label = gtk::Label::new(Some(&flg!("hard_sym_invalid_selection_label_2")));
let label3: gtk::Label = gtk::Label::new(Some(&flg!("hard_sym_invalid_selection_label_3")));
button_ok.grab_focus();
@ -364,15 +364,15 @@ pub async fn check_if_can_link_files(check_button_settings_confirm_link: &gtk::C
fn create_dialog_ask_for_linking(window_main: &gtk::Window) -> (Dialog, CheckButton) {
let dialog = gtk::Dialog::builder()
.title(&fl!("hard_sym_link_title_dialog"))
.title(&flg!("hard_sym_link_title_dialog"))
.transient_for(window_main)
.modal(true)
.build();
let button_ok = dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel);
let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let label: gtk::Label = gtk::Label::new(Some(&fl!("hard_sym_link_label")));
let check_button: gtk::CheckButton = gtk::CheckButton::with_label(&fl!("dialogs_ask_next_time"));
let label: gtk::Label = gtk::Label::new(Some(&flg!("hard_sym_link_label")));
let check_button: gtk::CheckButton = gtk::CheckButton::with_label(&flg!("dialogs_ask_next_time"));
check_button.set_active(true);
check_button.set_halign(Align::Center);

View File

@ -3,11 +3,11 @@ use std::path::{Path, PathBuf};
use gtk::prelude::*;
use gtk::{ResponseType, TreePath};
use czkawka_core::fl;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*;
use crate::localizer::generate_translation_hashmap;
use crate::localizer_core::generate_translation_hashmap;
use crate::notebook_enums::*;
pub fn connect_button_move(gui_data: &GuiData) {
@ -76,13 +76,13 @@ fn move_things(
reset_text_view(text_view_errors);
let chooser = gtk::FileChooserDialog::builder()
.title(&fl!("move_files_title_dialog"))
.title(&flg!("move_files_title_dialog"))
.action(gtk::FileChooserAction::SelectFolder)
.transient_for(window_main)
.modal(true)
.build();
chooser.add_button(&fl!("general_ok_button"), ResponseType::Ok);
chooser.add_button(&fl!("general_close_button"), ResponseType::Cancel);
chooser.add_button(&flg!("general_ok_button"), ResponseType::Ok);
chooser.add_button(&flg!("general_close_button"), ResponseType::Cancel);
chooser.set_select_multiple(false);
chooser.show_all();
@ -111,7 +111,7 @@ fn move_things(
if folders.len() != 1 {
add_text_to_text_view(
&text_view_errors,
fl!(
flg!(
"move_files_choose_more_than_1_path",
generate_translation_hashmap(vec![("path_number", folders.len().to_string())])
)
@ -234,13 +234,13 @@ fn move_files_common(
let destination_file = destination_folder.join(file_name);
if Path::new(&thing).is_dir() {
if let Err(e) = fs_extra::dir::move_dir(&thing, &destination_file, &fs_extra::dir::CopyOptions::new()) {
messages += fl!("move_folder_failed", generate_translation_hashmap(vec![("name", thing), ("reason", e.to_string())])).as_str();
messages += flg!("move_folder_failed", generate_translation_hashmap(vec![("name", thing), ("reason", e.to_string())])).as_str();
messages += "\n";
continue 'next_result;
}
} else {
if let Err(e) = fs_extra::file::move_file(&thing, &destination_file, &fs_extra::file::CopyOptions::new()) {
messages += fl!("move_file_failed", generate_translation_hashmap(vec![("name", thing), ("reason", e.to_string())])).as_str();
messages += flg!("move_file_failed", generate_translation_hashmap(vec![("name", thing), ("reason", e.to_string())])).as_str();
messages += "\n";
continue 'next_result;
@ -251,7 +251,7 @@ fn move_files_common(
}
entry_info.set_text(
fl!(
flg!(
"move_stats",
generate_translation_hashmap(vec![("num_files", moved_files.to_string()), ("all_files", selected_rows.len().to_string())])
)

View File

@ -5,12 +5,12 @@ use std::rc::Rc;
use gtk::prelude::*;
use gtk::{Button, Entry};
use crate::flg;
use czkawka_core::common_traits::SaveResults;
use czkawka_core::fl;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::BottomButtonsEnum;
use crate::localizer::generate_translation_hashmap;
use crate::localizer_core::generate_translation_hashmap;
use crate::notebook_enums::*;
pub fn connect_button_save(gui_data: &GuiData) {
@ -101,7 +101,7 @@ fn post_save_things(
entry_info: &Entry,
buttons_save: &Button,
) {
entry_info.set_text(fl!("save_results_to_file", generate_translation_hashmap(vec![("name", file_name.to_string())])).as_str());
entry_info.set_text(flg!("save_results_to_file", generate_translation_hashmap(vec![("name", file_name.to_string())])).as_str());
// Set state
{
buttons_save.hide();

View File

@ -25,7 +25,7 @@ use crate::help_combo_box::{
use crate::help_functions::*;
use crate::notebook_enums::*;
use crate::taskbar_progress::tbp_flags::TBPF_NOPROGRESS;
use crate::{fl, DEFAULT_MAXIMAL_FILE_SIZE, DEFAULT_MINIMAL_CACHE_SIZE, DEFAULT_MINIMAL_FILE_SIZE};
use crate::{flg, DEFAULT_MAXIMAL_FILE_SIZE, DEFAULT_MINIMAL_CACHE_SIZE, DEFAULT_MINIMAL_FILE_SIZE};
#[allow(clippy::too_many_arguments)]
pub fn connect_button_search(
@ -145,7 +145,7 @@ pub fn connect_button_search(
button_settings.set_sensitive(false);
button_app_info.set_sensitive(false);
entry_info.set_text(&fl!("searching_for_data"));
entry_info.set_text(&flg!("searching_for_data"));
// Resets progress bars
progress_bar_all_stages.set_fraction(0 as f64);
@ -424,7 +424,7 @@ pub fn connect_button_search(
&buttons_array,
&buttons_names,
);
entry_info.set_text(&fl!("search_not_choosing_any_music"));
entry_info.set_text(&flg!("search_not_choosing_any_music"));
show_dialog.store(false, Ordering::Relaxed);
}
}

View File

@ -3,7 +3,7 @@ use i18n_embed::unic_langid::LanguageIdentifier;
use i18n_embed::DesktopLanguageRequester;
use crate::language_functions::get_language_from_combo_box_text;
use crate::{GuiData, LANGUAGES_ALL};
use crate::{localizer_gui, GuiData, LANGUAGES_ALL};
// use i18n_embed::{DesktopLanguageRequester, Localizer};
@ -18,7 +18,10 @@ pub fn connect_change_language(gui_data: &GuiData) {
}
fn change_language(gui_data: &GuiData) {
let localizers = vec![("czkawka_gui", czkawka_core::localizer::localizer())];
let localizers = vec![
("czkawka_core", czkawka_core::localizer_core::localizer_core()),
("czkawka_gui", localizer_gui::localizer_gui()),
];
let lang_short = get_language_from_combo_box_text(gui_data.settings.combo_box_settings_language.active_text().unwrap().to_string()).short_text;

View File

@ -4,9 +4,9 @@ use regex::Regex;
use czkawka_core::common::Common;
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*;
use czkawka_core::fl;
// File length variable allows users to choose duplicates which have shorter file name
// e.g. 'tar.gz' will be selected instead 'tar.gz (copy)' etc.
@ -244,21 +244,21 @@ fn popover_custom_select_unselect(
popover.popdown();
let window_title = match select_things {
false => fl!("popover_custom_mode_unselect"),
true => fl!("popover_custom_mode_select"),
false => flg!("popover_custom_mode_unselect"),
true => flg!("popover_custom_mode_select"),
};
// Dialog for select/unselect items
{
let dialog = gtk::Dialog::builder().title(&window_title).transient_for(window_main).modal(true).build();
dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel);
dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let check_button_path = gtk::CheckButton::builder().label(&fl!("popover_custom_regex_path_label")).build();
let check_button_name = gtk::CheckButton::builder().label(&fl!("popover_custom_regex_name_label")).build();
let check_button_rust_regex = gtk::CheckButton::builder().label(&fl!("popover_custom_regex_regex_label")).build();
let check_button_path = gtk::CheckButton::builder().label(&flg!("popover_custom_regex_path_label")).build();
let check_button_name = gtk::CheckButton::builder().label(&flg!("popover_custom_regex_name_label")).build();
let check_button_rust_regex = gtk::CheckButton::builder().label(&flg!("popover_custom_regex_regex_label")).build();
let check_button_select_not_all_results = gtk::CheckButton::builder().label(&fl!("popover_custom_all_in_group_label")).build();
let check_button_select_not_all_results = gtk::CheckButton::builder().label(&flg!("popover_custom_all_in_group_label")).build();
check_button_select_not_all_results.set_active(true);
let entry_path = gtk::Entry::new();
@ -270,16 +270,16 @@ fn popover_custom_select_unselect(
// Tooltips
{
check_button_path.set_tooltip_text(Some(&fl!("popover_custom_path_check_button_entry_tooltip")));
entry_path.set_tooltip_text(Some(&fl!("popover_custom_path_check_button_entry_tooltip")));
check_button_path.set_tooltip_text(Some(&flg!("popover_custom_path_check_button_entry_tooltip")));
entry_path.set_tooltip_text(Some(&flg!("popover_custom_path_check_button_entry_tooltip")));
check_button_name.set_tooltip_text(Some(&fl!("popover_custom_name_check_button_entry_tooltip")));
entry_name.set_tooltip_text(Some(&fl!("popover_custom_name_check_button_entry_tooltip")));
check_button_name.set_tooltip_text(Some(&flg!("popover_custom_name_check_button_entry_tooltip")));
entry_name.set_tooltip_text(Some(&flg!("popover_custom_name_check_button_entry_tooltip")));
check_button_rust_regex.set_tooltip_text(Some(&fl!("popover_custom_regex_check_button_entry_tooltip")));
entry_rust_regex.set_tooltip_text(Some(&fl!("popover_custom_regex_check_button_entry_tooltip")));
check_button_rust_regex.set_tooltip_text(Some(&flg!("popover_custom_regex_check_button_entry_tooltip")));
entry_rust_regex.set_tooltip_text(Some(&flg!("popover_custom_regex_check_button_entry_tooltip")));
check_button_select_not_all_results.set_tooltip_text(Some(&fl!("popover_custom_not_all_check_button_tooltip")));
check_button_select_not_all_results.set_tooltip_text(Some(&flg!("popover_custom_not_all_check_button_tooltip")));
}
{
let label_regex_valid = label_regex_valid.clone();
@ -290,8 +290,8 @@ fn popover_custom_select_unselect(
message = "".to_string();
} else {
match Regex::new(&text_to_check) {
Ok(_) => message = fl!("popover_valid_regex"),
Err(_) => message = fl!("popover_invalid_regex"),
Ok(_) => message = flg!("popover_valid_regex"),
Err(_) => message = flg!("popover_invalid_regex"),
}
}

View File

@ -3,10 +3,10 @@ use gtk::prelude::*;
use czkawka_core::{big_file, broken_files, common_dir_traversal, similar_images, similar_videos, temporary};
use crate::flg;
use crate::gui_structs::gui_data::GuiData;
use crate::localizer::generate_translation_hashmap;
use crate::localizer_core::generate_translation_hashmap;
use crate::taskbar_progress::tbp_flags::TBPF_INDETERMINATE;
use czkawka_core::fl;
#[allow(clippy::too_many_arguments)]
pub fn connect_progress_window(
@ -43,7 +43,7 @@ pub fn connect_progress_window(
progress_bar_current_stage.hide();
// progress_bar_all_stages.hide();
progress_bar_all_stages.set_fraction(0 as f64);
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_size",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
));
@ -66,7 +66,7 @@ pub fn connect_progress_window(
taskbar_state.borrow().set_progress_value(1, 1 + item.max_stage as u64);
}
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_analyzed_partial_hash",
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())])
));
@ -86,7 +86,7 @@ pub fn connect_progress_window(
taskbar_state.borrow().set_progress_value(2, 1 + item.max_stage as u64);
}
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_analyzed_full_hash",
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())])
));
@ -100,7 +100,7 @@ pub fn connect_progress_window(
label_stage.show();
grid_progress_stages.hide();
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_name",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
));
@ -110,7 +110,7 @@ pub fn connect_progress_window(
label_stage.show();
grid_progress_stages.hide();
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_size",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
));
@ -130,7 +130,7 @@ pub fn connect_progress_window(
let taskbar_state = gui_data.taskbar_state.clone();
let future = async move {
while let Some(item) = futures_receiver_empty_files.next().await {
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
));
@ -145,7 +145,7 @@ pub fn connect_progress_window(
let taskbar_state = gui_data.taskbar_state.clone();
let future = async move {
while let Some(item) = futures_receiver_empty_folder.next().await {
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_empty_folders",
generate_translation_hashmap(vec![("folder_number", item.entries_checked.to_string())])
));
@ -160,7 +160,7 @@ pub fn connect_progress_window(
let taskbar_state = gui_data.taskbar_state.clone();
let future = async move {
while let Some(item) = futures_receiver_big_files.next().await {
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.files_checked.to_string())])
));
@ -180,7 +180,7 @@ pub fn connect_progress_window(
match item.current_stage {
0 => {
progress_bar_current_stage.hide();
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
));
@ -200,7 +200,7 @@ pub fn connect_progress_window(
progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(1, (item.max_stage + 1) as u64);
}
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_music_tags",
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())])
));
@ -218,7 +218,7 @@ pub fn connect_progress_window(
progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(2, (item.max_stage + 1) as u64);
}
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_music_tags_end",
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())])
));
@ -242,7 +242,7 @@ pub fn connect_progress_window(
match item.current_stage {
0 => {
progress_bar_current_stage.hide();
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.images_checked.to_string())])
));
@ -262,7 +262,7 @@ pub fn connect_progress_window(
progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(1, (item.max_stage + 1) as u64);
}
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_image",
generate_translation_hashmap(vec![("file_checked", item.images_checked.to_string()), ("all_files", item.images_to_check.to_string())])
));
@ -281,7 +281,7 @@ pub fn connect_progress_window(
progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(2, (item.max_stage + 1) as u64);
}
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_comparing_image_hashes",
generate_translation_hashmap(vec![("file_checked", item.images_checked.to_string()), ("all_files", item.images_to_check.to_string())])
));
@ -305,7 +305,7 @@ pub fn connect_progress_window(
match item.current_stage {
0 => {
progress_bar_current_stage.hide();
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.videos_checked.to_string())])
));
@ -325,7 +325,7 @@ pub fn connect_progress_window(
progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(1, (item.max_stage + 1) as u64);
}
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_video",
generate_translation_hashmap(vec![("file_checked", item.videos_checked.to_string()), ("all_files", item.videos_to_check.to_string())])
));
@ -344,7 +344,7 @@ pub fn connect_progress_window(
let taskbar_state = gui_data.taskbar_state.clone();
let future = async move {
while let Some(item) = futures_receiver_temporary.next().await {
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.files_checked.to_string())])
));
@ -359,7 +359,7 @@ pub fn connect_progress_window(
let taskbar_state = gui_data.taskbar_state.clone();
let future = async move {
while let Some(item) = futures_receiver_invalid_symlinks.next().await {
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
));
@ -379,7 +379,7 @@ pub fn connect_progress_window(
match item.current_stage {
0 => {
progress_bar_current_stage.hide();
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.files_checked.to_string())])
));
@ -398,7 +398,7 @@ pub fn connect_progress_window(
progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(1, (item.max_stage + 1) as u64);
}
label_stage.set_text(&fl!(
label_stage.set_text(&flg!(
"progress_scanning_broken_files",
generate_translation_hashmap(vec![("file_checked", item.files_checked.to_string()), ("all_files", item.files_to_check.to_string())])
));

View File

@ -3,9 +3,9 @@ use std::path::PathBuf;
use gtk::prelude::*;
use gtk::{ResponseType, TreeView, Window};
use crate::flg;
#[cfg(target_family = "windows")]
use czkawka_core::common::Common;
use czkawka_core::fl;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::{get_dialog_box_child, get_list_store, ColumnsExcludedDirectory, ColumnsIncludedDirectory};
@ -81,9 +81,9 @@ pub fn connect_selection_of_directories(gui_data: &GuiData) {
fn add_chosen_directories(window_main: &Window, tree_view: &TreeView, excluded_items: bool) {
let folders_to = if excluded_items {
fl!("exclude_folders_dialog_title")
flg!("exclude_folders_dialog_title")
} else {
fl!("include_folders_dialog_title")
flg!("include_folders_dialog_title")
};
let file_chooser = gtk::FileChooserDialog::builder()
@ -92,8 +92,8 @@ fn add_chosen_directories(window_main: &Window, tree_view: &TreeView, excluded_i
.transient_for(window_main)
.modal(true)
.build();
file_chooser.add_button(&fl!("general_ok_button"), ResponseType::Ok);
file_chooser.add_button(&fl!("general_close_button"), ResponseType::Cancel);
file_chooser.add_button(&flg!("general_ok_button"), ResponseType::Ok);
file_chooser.add_button(&flg!("general_close_button"), ResponseType::Cancel);
file_chooser.set_select_multiple(true);
file_chooser.show_all();
@ -140,12 +140,12 @@ fn add_chosen_directories(window_main: &Window, tree_view: &TreeView, excluded_i
fn add_manually_directories(window_main: &Window, tree_view: &TreeView, excluded_items: bool) {
let dialog = gtk::Dialog::builder()
.title(&fl!("include_manually_directories_dialog_title"))
.title(&flg!("include_manually_directories_dialog_title"))
.transient_for(window_main)
.modal(true)
.build();
dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel);
dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let entry: gtk::Entry = gtk::Entry::new();

View File

@ -7,9 +7,9 @@ use gtk::{LabelBuilder, ResponseType, Window};
use image::imageops::FilterType;
use img_hash::HashAlg;
use crate::flg;
use czkawka_core::common_messages::Messages;
use czkawka_core::duplicate::HashType;
use czkawka_core::fl;
use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::get_dialog_box_child;
@ -95,7 +95,7 @@ pub fn connect_settings(gui_data: &GuiData) {
let entry_settings_cache_file_minimal_size = gui_data.settings.entry_settings_cache_file_minimal_size.clone();
button_settings_duplicates_clear_cache.connect_clicked(move |_| {
let dialog = create_clear_cache_dialog(fl!("cache_clear_duplicates_title"), &settings_window);
let dialog = create_clear_cache_dialog(flg!("cache_clear_duplicates_title"), &settings_window);
dialog.show_all();
let text_view_errors = text_view_errors.clone();
@ -123,7 +123,7 @@ pub fn connect_settings(gui_data: &GuiData) {
}
}
messages.messages.push(fl!("cache_properly_cleared"));
messages.messages.push(flg!("cache_properly_cleared"));
text_view_errors.buffer().unwrap().set_text(messages.create_messages_text().as_str());
}
}
@ -137,7 +137,7 @@ pub fn connect_settings(gui_data: &GuiData) {
let text_view_errors = gui_data.text_view_errors.clone();
button_settings_similar_images_clear_cache.connect_clicked(move |_| {
let dialog = create_clear_cache_dialog(fl!("cache_clear_similar_images_title"), &settings_window);
let dialog = create_clear_cache_dialog(flg!("cache_clear_similar_images_title"), &settings_window);
dialog.show_all();
let text_view_errors = text_view_errors.clone();
@ -163,7 +163,7 @@ pub fn connect_settings(gui_data: &GuiData) {
}
}
messages.messages.push(fl!("cache_properly_cleared"));
messages.messages.push(flg!("cache_properly_cleared"));
text_view_errors.buffer().unwrap().set_text(messages.create_messages_text().as_str());
}
dialog.close();
@ -176,7 +176,7 @@ pub fn connect_settings(gui_data: &GuiData) {
let text_view_errors = gui_data.text_view_errors.clone();
button_settings_similar_videos_clear_cache.connect_clicked(move |_| {
let dialog = create_clear_cache_dialog(fl!("cache_clear_similar_videos_title"), &settings_window);
let dialog = create_clear_cache_dialog(flg!("cache_clear_similar_videos_title"), &settings_window);
dialog.show_all();
let text_view_errors = text_view_errors.clone();
@ -188,7 +188,7 @@ pub fn connect_settings(gui_data: &GuiData) {
czkawka_core::similar_videos::save_hashes_to_file(&cache_entries, &mut messages, false);
}
messages.messages.push(fl!("cache_properly_cleared"));
messages.messages.push(flg!("cache_properly_cleared"));
text_view_errors.buffer().unwrap().set_text(messages.create_messages_text().as_str());
}
dialog.close();
@ -200,13 +200,13 @@ pub fn connect_settings(gui_data: &GuiData) {
fn create_clear_cache_dialog(title_str: String, window_settings: &Window) -> gtk::Dialog {
let dialog = gtk::Dialog::builder().title(&title_str).modal(true).transient_for(window_settings).build();
dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel);
dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let label = LabelBuilder::new().label(&fl!("cache_clear_message_label_1")).build();
let label2 = LabelBuilder::new().label(&fl!("cache_clear_message_label_2")).build();
let label3 = LabelBuilder::new().label(&fl!("cache_clear_message_label_3")).build();
let label4 = LabelBuilder::new().label(&fl!("cache_clear_message_label_4")).build();
let label = LabelBuilder::new().label(&flg!("cache_clear_message_label_1")).build();
let label2 = LabelBuilder::new().label(&flg!("cache_clear_message_label_2")).build();
let label3 = LabelBuilder::new().label(&flg!("cache_clear_message_label_3")).build();
let label4 = LabelBuilder::new().label(&flg!("cache_clear_message_label_4")).build();
let internal_box = get_dialog_box_child(&dialog);
internal_box.add(&label);

View File

@ -2,7 +2,7 @@ use gdk::gdk_pixbuf::Pixbuf;
use gtk::prelude::*;
use gtk::{Builder, Window};
use czkawka_core::fl;
use crate::flg;
#[derive(Clone)]
pub struct GuiAbout {
@ -81,17 +81,17 @@ impl GuiAbout {
}
pub fn update_language(&self) {
let mut comment_text: String = "2020 - 2022 Rafał Mikrut(qarmin)\n\n".to_string();
comment_text += &fl!("about_window_motto");
comment_text += &flg!("about_window_motto");
self.about_dialog.set_comments(Some(&comment_text));
self.button_repository.set_tooltip_text(Some(&fl!("about_repository_button_tooltip")));
self.button_donation.set_tooltip_text(Some(&fl!("about_donation_button_tooltip")));
self.button_instruction.set_tooltip_text(Some(&fl!("about_instruction_button_tooltip")));
self.button_translation.set_tooltip_text(Some(&fl!("about_translation_button_tooltip")));
self.button_repository.set_tooltip_text(Some(&flg!("about_repository_button_tooltip")));
self.button_donation.set_tooltip_text(Some(&flg!("about_donation_button_tooltip")));
self.button_instruction.set_tooltip_text(Some(&flg!("about_instruction_button_tooltip")));
self.button_translation.set_tooltip_text(Some(&flg!("about_translation_button_tooltip")));
self.button_repository.set_label(&fl!("about_repository_button"));
self.button_donation.set_label(&fl!("about_donation_button"));
self.button_instruction.set_label(&fl!("about_instruction_button"));
self.button_translation.set_label(&fl!("about_translation_button"));
self.button_repository.set_label(&flg!("about_repository_button"));
self.button_donation.set_label(&flg!("about_donation_button"));
self.button_instruction.set_label(&flg!("about_instruction_button"));
self.button_translation.set_label(&flg!("about_translation_button"));
}
}

View File

@ -1,8 +1,8 @@
use gtk::prelude::*;
use gtk::{Bin, Widget};
use crate::flg;
use crate::help_functions::{get_custom_label_from_button_with_image, BottomButtonsEnum};
use czkawka_core::fl;
#[derive(Clone)]
pub struct GuiBottomButtons {
@ -73,31 +73,31 @@ impl GuiBottomButtons {
}
}
pub fn update_language(&self) {
get_custom_label_from_button_with_image(&self.buttons_search.clone().upcast::<Bin>()).set_text(&fl!("bottom_search_button"));
get_custom_label_from_button_with_image(&self.buttons_select.clone().upcast::<Bin>()).set_text(&fl!("bottom_select_button"));
get_custom_label_from_button_with_image(&self.buttons_delete.clone().upcast::<Bin>()).set_text(&fl!("bottom_delete_button"));
get_custom_label_from_button_with_image(&self.buttons_save.clone().upcast::<Bin>()).set_text(&fl!("bottom_save_button"));
get_custom_label_from_button_with_image(&self.buttons_symlink.clone().upcast::<Bin>()).set_text(&fl!("bottom_symlink_button"));
get_custom_label_from_button_with_image(&self.buttons_hardlink.clone().upcast::<Bin>()).set_text(&fl!("bottom_hardlink_button"));
get_custom_label_from_button_with_image(&self.buttons_move.clone().upcast::<Bin>()).set_text(&fl!("bottom_move_button"));
get_custom_label_from_button_with_image(&self.buttons_search.clone().upcast::<Bin>()).set_text(&flg!("bottom_search_button"));
get_custom_label_from_button_with_image(&self.buttons_select.clone().upcast::<Bin>()).set_text(&flg!("bottom_select_button"));
get_custom_label_from_button_with_image(&self.buttons_delete.clone().upcast::<Bin>()).set_text(&flg!("bottom_delete_button"));
get_custom_label_from_button_with_image(&self.buttons_save.clone().upcast::<Bin>()).set_text(&flg!("bottom_save_button"));
get_custom_label_from_button_with_image(&self.buttons_symlink.clone().upcast::<Bin>()).set_text(&flg!("bottom_symlink_button"));
get_custom_label_from_button_with_image(&self.buttons_hardlink.clone().upcast::<Bin>()).set_text(&flg!("bottom_hardlink_button"));
get_custom_label_from_button_with_image(&self.buttons_move.clone().upcast::<Bin>()).set_text(&flg!("bottom_move_button"));
// get_custom_label_from_button_with_image(&self.buttons_search.clone()).set_text(&fl!("bottom_search_button"));
// get_custom_label_from_button_with_image(&self.buttons_select.clone()).set_text(&fl!("bottom_select_button"));
// get_custom_label_from_button_with_image(&self.buttons_delete.clone()).set_text(&fl!("bottom_delete_button"));
// get_custom_label_from_button_with_image(&self.buttons_save.clone()).set_text(&fl!("bottom_save_button"));
// get_custom_label_from_button_with_image(&self.buttons_symlink.clone()).set_text(&fl!("bottom_symlink_button"));
// get_custom_label_from_button_with_image(&self.buttons_hardlink.clone()).set_text(&fl!("bottom_hardlink_button"));
// get_custom_label_from_button_with_image(&self.buttons_move.clone()).set_text(&fl!("bottom_move_button"));
// get_custom_label_from_button_with_image(&self.buttons_search.clone()).set_text(&flg!("bottom_search_button"));
// get_custom_label_from_button_with_image(&self.buttons_select.clone()).set_text(&flg!("bottom_select_button"));
// get_custom_label_from_button_with_image(&self.buttons_delete.clone()).set_text(&flg!("bottom_delete_button"));
// get_custom_label_from_button_with_image(&self.buttons_save.clone()).set_text(&flg!("bottom_save_button"));
// get_custom_label_from_button_with_image(&self.buttons_symlink.clone()).set_text(&flg!("bottom_symlink_button"));
// get_custom_label_from_button_with_image(&self.buttons_hardlink.clone()).set_text(&flg!("bottom_hardlink_button"));
// get_custom_label_from_button_with_image(&self.buttons_move.clone()).set_text(&flg!("bottom_move_button"));
self.buttons_search.set_tooltip_text(Some(&fl!("bottom_search_button_tooltip")));
self.buttons_select.set_tooltip_text(Some(&fl!("bottom_select_button_tooltip")));
self.buttons_delete.set_tooltip_text(Some(&fl!("bottom_delete_button_tooltip")));
self.buttons_save.set_tooltip_text(Some(&fl!("bottom_save_button_tooltip")));
self.buttons_symlink.set_tooltip_text(Some(&fl!("bottom_symlink_button_tooltip")));
self.buttons_hardlink.set_tooltip_text(Some(&fl!("bottom_hardlink_button_tooltip")));
self.buttons_move.set_tooltip_text(Some(&fl!("bottom_move_button_tooltip")));
self.buttons_search.set_tooltip_text(Some(&flg!("bottom_search_button_tooltip")));
self.buttons_select.set_tooltip_text(Some(&flg!("bottom_select_button_tooltip")));
self.buttons_delete.set_tooltip_text(Some(&flg!("bottom_delete_button_tooltip")));
self.buttons_save.set_tooltip_text(Some(&flg!("bottom_save_button_tooltip")));
self.buttons_symlink.set_tooltip_text(Some(&flg!("bottom_symlink_button_tooltip")));
self.buttons_hardlink.set_tooltip_text(Some(&flg!("bottom_hardlink_button_tooltip")));
self.buttons_move.set_tooltip_text(Some(&flg!("bottom_move_button_tooltip")));
self.buttons_show_errors.set_tooltip_text(Some(&fl!("bottom_show_errors_tooltip")));
self.buttons_show_upper_notebook.set_tooltip_text(Some(&fl!("bottom_show_upper_notebook_tooltip")));
self.buttons_show_errors.set_tooltip_text(Some(&flg!("bottom_show_errors_tooltip")));
self.buttons_show_upper_notebook.set_tooltip_text(Some(&flg!("bottom_show_upper_notebook_tooltip")));
}
}

View File

@ -1,4 +1,4 @@
use czkawka_core::fl;
use crate::flg;
use gtk::prelude::*;
use gtk::{Builder, TreePath};
use std::cell::RefCell;
@ -34,7 +34,7 @@ impl GuiCompareImages {
let builder = Builder::from_string(glade_src.as_str());
let window_compare: gtk::Window = builder.object("window_compare").unwrap();
window_compare.set_title(&fl!("window_compare_images"));
window_compare.set_title(&flg!("window_compare_images"));
window_compare.set_modal(true);
window_compare.set_transient_for(Some(window_main));
@ -75,6 +75,6 @@ impl GuiCompareImages {
}
}
pub fn update_language(&self) {
self.window_compare.set_title(&fl!("window_compare_images"));
self.window_compare.set_title(&flg!("window_compare_images"));
}
}

View File

@ -7,12 +7,12 @@ use gdk::gdk_pixbuf::Pixbuf;
use gtk::prelude::*;
use gtk::Builder;
use crate::flg;
use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::BrokenFiles;
use czkawka_core::duplicate::DuplicateFinder;
use czkawka_core::empty_files::EmptyFiles;
use czkawka_core::empty_folder::EmptyFolder;
use czkawka_core::fl;
use czkawka_core::invalid_symlinks::InvalidSymlinks;
use czkawka_core::same_music::SameMusic;
use czkawka_core::similar_images::SimilarImages;
@ -93,7 +93,7 @@ impl GuiData {
//// Windows
let window_main: gtk::Window = builder.object("window_main").unwrap();
window_main.set_title(&fl!("window_main_title"));
window_main.set_title(&flg!("window_main_title"));
window_main.show_all();
let pixbuf = Pixbuf::from_read(std::io::BufReader::new(&ICON_ABOUT[..])).unwrap();
@ -193,7 +193,7 @@ impl GuiData {
}
pub fn update_language(&self) {
self.window_main.set_title(&fl!("window_main_title"));
self.window_main.set_title(&flg!("window_main_title"));
self.main_notebook.update_language();
self.upper_notebook.update_language();

View File

@ -1,6 +1,6 @@
use gtk::prelude::*;
use czkawka_core::fl;
use crate::flg;
#[derive(Clone)]
pub struct GuiHeader {
@ -17,7 +17,7 @@ impl GuiHeader {
}
pub fn update_language(&self) {
self.button_settings.set_tooltip_text(Some(&fl!("header_setting_button_tooltip")));
self.button_app_info.set_tooltip_text(Some(&fl!("header_about_button_tooltip")));
self.button_settings.set_tooltip_text(Some(&flg!("header_setting_button_tooltip")));
self.button_app_info.set_tooltip_text(Some(&flg!("header_about_button_tooltip")));
}
}

View File

@ -1,12 +1,13 @@
use czkawka_core::common_dir_traversal::CheckingMethod;
use czkawka_core::localizer_core::{fnc_get_similarity_minimal, fnc_get_similarity_very_high};
use gtk::prelude::*;
use gtk::{EventControllerKey, TreeView};
use czkawka_core::similar_images::{get_string_from_similarity, Similarity, SIMILAR_VALUES};
use crate::flg;
use crate::help_combo_box::{DUPLICATES_CHECK_METHOD_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX};
use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
use czkawka_core::fl;
#[derive(Clone)]
pub struct GuiMainNotebook {
@ -316,52 +317,52 @@ impl GuiMainNotebook {
}
pub fn update_language(&self) {
self.check_button_music_title.set_label(&fl!("music_title_checkbox"));
self.check_button_music_artist.set_label(&fl!("music_artist_checkbox"));
self.check_button_music_album_title.set_label(&fl!("music_album_title_checkbox"));
self.check_button_music_album_artist.set_label(&fl!("music_album_artist_checkbox"));
self.check_button_music_year.set_label(&fl!("music_year_checkbox"));
self.check_button_music_approximate_comparison.set_label(&fl!("music_comparison_checkbox"));
self.check_button_music_title.set_label(&flg!("music_title_checkbox"));
self.check_button_music_artist.set_label(&flg!("music_artist_checkbox"));
self.check_button_music_album_title.set_label(&flg!("music_album_title_checkbox"));
self.check_button_music_album_artist.set_label(&flg!("music_album_artist_checkbox"));
self.check_button_music_year.set_label(&flg!("music_year_checkbox"));
self.check_button_music_approximate_comparison.set_label(&flg!("music_comparison_checkbox"));
self.check_button_music_approximate_comparison
.set_tooltip_text(Some(&fl!("music_comparison_checkbox_tooltip")));
.set_tooltip_text(Some(&flg!("music_comparison_checkbox_tooltip")));
self.label_duplicate_check_method.set_label(&fl!("main_label_check_method"));
self.label_duplicate_hash_type.set_label(&fl!("main_label_hash_type"));
self.label_big_shown_files.set_label(&fl!("main_label_shown_files"));
self.label_image_resize_algorithm.set_label(&fl!("main_label_resize_algorithm"));
self.label_image_hash_type.set_label(&fl!("main_label_hash_type"));
self.label_image_hash_size.set_label(&fl!("main_label_hash_size"));
self.label_image_similarity.set_label(&fl!("main_label_similarity"));
self.label_image_similarity_max.set_label(&fl!("core_similarity_very_high"));
self.label_video_similarity.set_label(&fl!("main_label_similarity"));
self.label_video_similarity_min.set_label(&fl!("core_similarity_minimal"));
self.label_video_similarity_max.set_label(&fl!("core_similarity_very_high"));
self.label_duplicate_check_method.set_label(&flg!("main_label_check_method"));
self.label_duplicate_hash_type.set_label(&flg!("main_label_hash_type"));
self.label_big_shown_files.set_label(&flg!("main_label_shown_files"));
self.label_image_resize_algorithm.set_label(&flg!("main_label_resize_algorithm"));
self.label_image_hash_type.set_label(&flg!("main_label_hash_type"));
self.label_image_hash_size.set_label(&flg!("main_label_hash_size"));
self.label_image_similarity.set_label(&flg!("main_label_similarity"));
self.label_image_similarity_max.set_label(&fnc_get_similarity_very_high());
self.label_video_similarity.set_label(&flg!("main_label_similarity"));
self.label_video_similarity_min.set_label(&fnc_get_similarity_minimal());
self.label_video_similarity_max.set_label(&fnc_get_similarity_very_high());
self.label_duplicate_check_method.set_tooltip_text(Some(&fl!("duplicate_check_method_tooltip")));
self.combo_box_duplicate_check_method.set_tooltip_text(Some(&fl!("duplicate_check_method_tooltip")));
self.label_duplicate_hash_type.set_tooltip_text(Some(&fl!("duplicate_hash_type_tooltip")));
self.combo_box_duplicate_hash_type.set_tooltip_text(Some(&fl!("duplicate_hash_type_tooltip")));
self.label_duplicate_check_method.set_tooltip_text(Some(&flg!("duplicate_check_method_tooltip")));
self.combo_box_duplicate_check_method.set_tooltip_text(Some(&flg!("duplicate_check_method_tooltip")));
self.label_duplicate_hash_type.set_tooltip_text(Some(&flg!("duplicate_hash_type_tooltip")));
self.combo_box_duplicate_hash_type.set_tooltip_text(Some(&flg!("duplicate_hash_type_tooltip")));
self.combo_box_image_hash_size.set_tooltip_text(Some(&fl!("image_hash_size_tooltip")));
self.label_image_hash_size.set_tooltip_text(Some(&fl!("image_hash_size_tooltip")));
self.combo_box_image_hash_size.set_tooltip_text(Some(&flg!("image_hash_size_tooltip")));
self.label_image_hash_size.set_tooltip_text(Some(&flg!("image_hash_size_tooltip")));
self.combo_box_image_resize_algorithm.set_tooltip_text(Some(&fl!("image_resize_filter_tooltip")));
self.label_image_resize_algorithm.set_tooltip_text(Some(&fl!("image_resize_filter_tooltip")));
self.combo_box_image_resize_algorithm.set_tooltip_text(Some(&flg!("image_resize_filter_tooltip")));
self.label_image_resize_algorithm.set_tooltip_text(Some(&flg!("image_resize_filter_tooltip")));
self.combo_box_image_hash_algorithm.set_tooltip_text(Some(&fl!("image_hash_alg_tooltip")));
self.label_image_hash_type.set_tooltip_text(Some(&fl!("image_hash_alg_tooltip")));
self.combo_box_image_hash_algorithm.set_tooltip_text(Some(&flg!("image_hash_alg_tooltip")));
self.label_image_hash_type.set_tooltip_text(Some(&flg!("image_hash_alg_tooltip")));
self.check_button_image_ignore_same_size
.set_tooltip_text(Some(&fl!("check_button_general_same_size_tooltip")));
.set_tooltip_text(Some(&flg!("check_button_general_same_size_tooltip")));
self.check_button_video_ignore_same_size
.set_tooltip_text(Some(&fl!("check_button_general_same_size_tooltip")));
self.check_button_image_ignore_same_size.set_label(&fl!("check_button_general_same_size"));
self.check_button_video_ignore_same_size.set_label(&fl!("check_button_general_same_size"));
.set_tooltip_text(Some(&flg!("check_button_general_same_size_tooltip")));
self.check_button_image_ignore_same_size.set_label(&flg!("check_button_general_same_size"));
self.check_button_video_ignore_same_size.set_label(&flg!("check_button_general_same_size"));
self.check_button_image_fast_compare.set_label(&fl!("main_notebook_image_fast_compare"));
self.check_button_image_fast_compare.set_label(&flg!("main_notebook_image_fast_compare"));
self.check_button_image_fast_compare
.set_tooltip_text(Some(&fl!("main_notebook_image_fast_compare_tooltip")));
.set_tooltip_text(Some(&flg!("main_notebook_image_fast_compare_tooltip")));
{
let hash_size_index = self.combo_box_image_hash_size.active().unwrap() as usize;
@ -394,16 +395,16 @@ impl GuiMainNotebook {
// Change name of main notebook tabs
for (main_enum, fl_thing) in [
(NotebookMainEnum::Duplicate as usize, fl!("main_notebook_duplicates")),
(NotebookMainEnum::EmptyDirectories as usize, fl!("main_notebook_empty_directories")),
(NotebookMainEnum::BigFiles as usize, fl!("main_notebook_big_files")),
(NotebookMainEnum::EmptyFiles as usize, fl!("main_notebook_empty_files")),
(NotebookMainEnum::Temporary as usize, fl!("main_notebook_temporary")),
(NotebookMainEnum::SimilarImages as usize, fl!("main_notebook_similar_images")),
(NotebookMainEnum::SimilarVideos as usize, fl!("main_notebook_similar_videos")),
(NotebookMainEnum::SameMusic as usize, fl!("main_notebook_same_music")),
(NotebookMainEnum::Symlinks as usize, fl!("main_notebook_symlinks")),
(NotebookMainEnum::BrokenFiles as usize, fl!("main_notebook_broken_files")),
(NotebookMainEnum::Duplicate as usize, flg!("main_notebook_duplicates")),
(NotebookMainEnum::EmptyDirectories as usize, flg!("main_notebook_empty_directories")),
(NotebookMainEnum::BigFiles as usize, flg!("main_notebook_big_files")),
(NotebookMainEnum::EmptyFiles as usize, flg!("main_notebook_empty_files")),
(NotebookMainEnum::Temporary as usize, flg!("main_notebook_temporary")),
(NotebookMainEnum::SimilarImages as usize, flg!("main_notebook_similar_images")),
(NotebookMainEnum::SimilarVideos as usize, flg!("main_notebook_similar_videos")),
(NotebookMainEnum::SameMusic as usize, flg!("main_notebook_same_music")),
(NotebookMainEnum::Symlinks as usize, flg!("main_notebook_symlinks")),
(NotebookMainEnum::BrokenFiles as usize, flg!("main_notebook_broken_files")),
] {
self.notebook_main
.tab_label(&vec_children[main_enum])
@ -416,69 +417,69 @@ impl GuiMainNotebook {
// Change names of columns
let names_of_columns = [
vec![
fl!("main_tree_view_column_size"),
fl!("main_tree_view_column_file_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_size"),
flg!("main_tree_view_column_file_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_modification"),
], // Duplicates
vec![
fl!("main_tree_view_column_folder_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_folder_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_modification"),
], // Empty Folders
vec![
fl!("main_tree_view_column_size"),
fl!("main_tree_view_column_file_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_size"),
flg!("main_tree_view_column_file_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_modification"),
], // Big files
vec![
fl!("main_tree_view_column_file_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_file_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_modification"),
], // Empty files
vec![
fl!("main_tree_view_column_file_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_file_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_modification"),
], // Temporary Files
vec![
fl!("main_tree_view_column_similarity"),
fl!("main_tree_view_column_size"),
fl!("main_tree_view_column_dimensions"),
fl!("main_tree_view_column_file_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_similarity"),
flg!("main_tree_view_column_size"),
flg!("main_tree_view_column_dimensions"),
flg!("main_tree_view_column_file_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_modification"),
], // Similar Images
vec![
fl!("main_tree_view_column_size"),
fl!("main_tree_view_column_file_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_size"),
flg!("main_tree_view_column_file_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_modification"),
], // Similar Videos
vec![
fl!("main_tree_view_column_size"),
fl!("main_tree_view_column_file_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_title"),
fl!("main_tree_view_column_artist"),
fl!("main_tree_view_column_year"),
fl!("main_tree_view_column_album_title"),
fl!("main_tree_view_column_album_artist"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_size"),
flg!("main_tree_view_column_file_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_title"),
flg!("main_tree_view_column_artist"),
flg!("main_tree_view_column_year"),
flg!("main_tree_view_column_album_title"),
flg!("main_tree_view_column_album_artist"),
flg!("main_tree_view_column_modification"),
], // Music Dupliactes
vec![
fl!("main_tree_view_column_symlink_file_name"),
fl!("main_tree_view_column_symlink_folder"),
fl!("main_tree_view_column_destination_path"),
fl!("main_tree_view_column_type_of_error"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_symlink_file_name"),
flg!("main_tree_view_column_symlink_folder"),
flg!("main_tree_view_column_destination_path"),
flg!("main_tree_view_column_type_of_error"),
flg!("main_tree_view_column_modification"),
], // Invalid Symlinks
vec![
fl!("main_tree_view_column_file_name"),
fl!("main_tree_view_column_path"),
fl!("main_tree_view_column_type_of_error"),
fl!("main_tree_view_column_modification"),
flg!("main_tree_view_column_file_name"),
flg!("main_tree_view_column_path"),
flg!("main_tree_view_column_type_of_error"),
flg!("main_tree_view_column_modification"),
], // Broken Files
];
@ -496,9 +497,9 @@ impl GuiMainNotebook {
self.combo_box_duplicate_check_method.remove_all();
for i in &DUPLICATES_CHECK_METHOD_COMBO_BOX {
let text = match i.check_method {
CheckingMethod::Hash => fl!("duplicate_mode_hash_combo_box"),
CheckingMethod::Size => fl!("duplicate_mode_size_combo_box"),
CheckingMethod::Name => fl!("duplicate_mode_name_combo_box"),
CheckingMethod::Hash => flg!("duplicate_mode_hash_combo_box"),
CheckingMethod::Size => flg!("duplicate_mode_size_combo_box"),
CheckingMethod::Name => flg!("duplicate_mode_name_combo_box"),
_ => {
panic!()
}

View File

@ -1,7 +1,7 @@
use gtk::prelude::*;
use gtk::Builder;
use czkawka_core::fl;
use crate::flg;
#[derive(Clone)]
pub struct GuiPopovers {
@ -85,18 +85,18 @@ impl GuiPopovers {
}
}
pub fn update_language(&self) {
self.buttons_popover_select_all.set_label(&fl!("popover_select_all"));
self.buttons_popover_unselect_all.set_label(&fl!("popover_unselect_all"));
self.buttons_popover_reverse.set_label(&fl!("popover_reverse"));
self.buttons_popover_select_all_except_oldest.set_label(&fl!("popover_select_all_except_oldest"));
self.buttons_popover_select_all_except_newest.set_label(&fl!("popover_select_all_except_newest"));
self.buttons_popover_select_one_oldest.set_label(&fl!("popover_select_one_oldest"));
self.buttons_popover_select_one_newest.set_label(&fl!("popover_select_one_newest"));
self.buttons_popover_select_custom.set_label(&fl!("popover_select_custom"));
self.buttons_popover_unselect_custom.set_label(&fl!("popover_unselect_custom"));
self.buttons_popover_select_all.set_label(&flg!("popover_select_all"));
self.buttons_popover_unselect_all.set_label(&flg!("popover_unselect_all"));
self.buttons_popover_reverse.set_label(&flg!("popover_reverse"));
self.buttons_popover_select_all_except_oldest.set_label(&flg!("popover_select_all_except_oldest"));
self.buttons_popover_select_all_except_newest.set_label(&flg!("popover_select_all_except_newest"));
self.buttons_popover_select_one_oldest.set_label(&flg!("popover_select_one_oldest"));
self.buttons_popover_select_one_newest.set_label(&flg!("popover_select_one_newest"));
self.buttons_popover_select_custom.set_label(&flg!("popover_select_custom"));
self.buttons_popover_unselect_custom.set_label(&flg!("popover_unselect_custom"));
self.buttons_popover_select_all_images_except_biggest
.set_label(&fl!("popover_select_all_images_except_biggest"));
.set_label(&flg!("popover_select_all_images_except_biggest"));
self.buttons_popover_select_all_images_except_smallest
.set_label(&fl!("popover_select_all_images_except_smallest"));
.set_label(&flg!("popover_select_all_images_except_smallest"));
}
}

View File

@ -1,8 +1,8 @@
use gtk::prelude::*;
use gtk::{Bin, Builder, EventControllerKey, Window};
use crate::flg;
use crate::help_functions::get_custom_label_from_button_with_image;
use czkawka_core::fl;
#[derive(Clone)]
pub struct GuiProgressDialog {
@ -28,7 +28,7 @@ impl GuiProgressDialog {
let builder = Builder::from_string(glade_src.as_str());
let window_progress: gtk::Dialog = builder.object("window_progress").unwrap();
window_progress.set_title(&fl!("window_progress_title"));
window_progress.set_title(&flg!("window_progress_title"));
window_progress.set_transient_for(Some(window_main));
window_progress.set_modal(true);
@ -61,11 +61,11 @@ impl GuiProgressDialog {
}
}
pub fn update_language(&self) {
self.window_progress.set_title(&fl!("window_progress_title"));
self.window_progress.set_title(&flg!("window_progress_title"));
get_custom_label_from_button_with_image(&self.button_stop_in_dialog.clone().upcast::<Bin>()).set_text(&fl!("progress_stop_button"));
get_custom_label_from_button_with_image(&self.button_stop_in_dialog.clone().upcast::<Bin>()).set_text(&flg!("progress_stop_button"));
self.label_progress_current_stage.set_label(&fl!("progress_current_stage"));
self.label_progress_all_stages.set_label(&fl!("progress_all_stages"));
self.label_progress_current_stage.set_label(&flg!("progress_current_stage"));
self.label_progress_all_stages.set_label(&flg!("progress_all_stages"));
}
}

View File

@ -1,7 +1,7 @@
use gtk::prelude::*;
use gtk::{Builder, Window};
use czkawka_core::fl;
use crate::flg;
#[derive(Clone)]
pub struct GuiSettings {
@ -57,7 +57,7 @@ impl GuiSettings {
let builder = Builder::from_string(glade_src.as_str());
let window_settings: gtk::Window = builder.object("window_settings").unwrap();
window_settings.set_title(&fl!("window_settings_title"));
window_settings.set_title(&flg!("window_settings_title"));
window_settings.set_modal(true);
window_settings.set_transient_for(Some(window_main));
@ -141,98 +141,100 @@ impl GuiSettings {
}
pub fn update_language(&self) {
self.window_settings.set_title(&fl!("window_settings_title"));
self.window_settings.set_title(&flg!("window_settings_title"));
self.check_button_settings_save_at_exit.set_label(&fl!("settings_save_at_exit_button"));
self.check_button_settings_load_at_start.set_label(&fl!("settings_load_at_start_button"));
self.check_button_settings_confirm_deletion.set_label(&fl!("settings_confirm_deletion_button"));
self.check_button_settings_confirm_link.set_label(&fl!("settings_confirm_link_button"));
self.check_button_settings_confirm_group_deletion.set_label(&fl!("settings_confirm_group_deletion_button"));
self.check_button_settings_show_text_view.set_label(&fl!("settings_show_text_view_button"));
self.check_button_settings_use_cache.set_label(&fl!("settings_use_cache_button"));
self.check_button_settings_save_also_json.set_label(&fl!("settings_save_also_as_json_button"));
self.check_button_settings_use_trash.set_label(&fl!("settings_use_trash_button"));
self.label_settings_general_language.set_label(&fl!("settings_language_label"));
self.check_button_settings_save_at_exit.set_label(&flg!("settings_save_at_exit_button"));
self.check_button_settings_load_at_start.set_label(&flg!("settings_load_at_start_button"));
self.check_button_settings_confirm_deletion.set_label(&flg!("settings_confirm_deletion_button"));
self.check_button_settings_confirm_link.set_label(&flg!("settings_confirm_link_button"));
self.check_button_settings_confirm_group_deletion.set_label(&flg!("settings_confirm_group_deletion_button"));
self.check_button_settings_show_text_view.set_label(&flg!("settings_show_text_view_button"));
self.check_button_settings_use_cache.set_label(&flg!("settings_use_cache_button"));
self.check_button_settings_save_also_json.set_label(&flg!("settings_save_also_as_json_button"));
self.check_button_settings_use_trash.set_label(&flg!("settings_use_trash_button"));
self.label_settings_general_language.set_label(&flg!("settings_language_label"));
self.check_button_settings_save_at_exit.set_tooltip_text(Some(&fl!("settings_save_at_exit_button_tooltip")));
self.check_button_settings_save_at_exit
.set_tooltip_text(Some(&flg!("settings_save_at_exit_button_tooltip")));
self.check_button_settings_load_at_start
.set_tooltip_text(Some(&fl!("settings_load_at_start_button_tooltip")));
.set_tooltip_text(Some(&flg!("settings_load_at_start_button_tooltip")));
self.check_button_settings_confirm_deletion
.set_tooltip_text(Some(&fl!("settings_confirm_deletion_button_tooltip")));
self.check_button_settings_confirm_link.set_tooltip_text(Some(&fl!("settings_confirm_link_button_tooltip")));
.set_tooltip_text(Some(&flg!("settings_confirm_deletion_button_tooltip")));
self.check_button_settings_confirm_link
.set_tooltip_text(Some(&flg!("settings_confirm_link_button_tooltip")));
self.check_button_settings_confirm_group_deletion
.set_tooltip_text(Some(&fl!("settings_confirm_group_deletion_button_tooltip")));
.set_tooltip_text(Some(&flg!("settings_confirm_group_deletion_button_tooltip")));
self.check_button_settings_show_text_view
.set_tooltip_text(Some(&fl!("settings_show_text_view_button_tooltip")));
.set_tooltip_text(Some(&flg!("settings_show_text_view_button_tooltip")));
self.check_button_settings_save_also_json
.set_tooltip_text(Some(&fl!("settings_save_also_as_json_button_tooltip")));
self.check_button_settings_use_cache.set_tooltip_text(Some(&fl!("settings_use_cache_button_tooltip")));
self.check_button_settings_use_trash.set_tooltip_text(Some(&fl!("settings_use_trash_button_tooltip")));
self.label_settings_general_language.set_tooltip_text(Some(&fl!("settings_language_label_tooltip")));
.set_tooltip_text(Some(&flg!("settings_save_also_as_json_button_tooltip")));
self.check_button_settings_use_cache.set_tooltip_text(Some(&flg!("settings_use_cache_button_tooltip")));
self.check_button_settings_use_trash.set_tooltip_text(Some(&flg!("settings_use_trash_button_tooltip")));
self.label_settings_general_language.set_tooltip_text(Some(&flg!("settings_language_label_tooltip")));
self.check_button_settings_hide_hard_links.set_label(&fl!("settings_duplicates_hide_hard_link_button"));
self.check_button_settings_hide_hard_links.set_label(&flg!("settings_duplicates_hide_hard_link_button"));
self.check_button_settings_show_preview_duplicates
.set_label(&fl!("settings_multiple_image_preview_checkbutton"));
.set_label(&flg!("settings_multiple_image_preview_checkbutton"));
self.check_button_settings_duplicates_delete_outdated_cache
.set_label(&fl!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_duplicates_clear_cache.set_label(&fl!("settings_multiple_clear_cache_button"));
self.check_button_duplicates_use_prehash_cache.set_label(&fl!("settings_duplicates_prehash_checkbutton"));
.set_label(&flg!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_duplicates_clear_cache.set_label(&flg!("settings_multiple_clear_cache_button"));
self.check_button_duplicates_use_prehash_cache.set_label(&flg!("settings_duplicates_prehash_checkbutton"));
self.label_settings_duplicate_minimal_size_cache
.set_label(&fl!("settings_duplicates_minimal_size_cache_label"));
.set_label(&flg!("settings_duplicates_minimal_size_cache_label"));
self.label_settings_duplicate_minimal_size_cache_prehash
.set_label(&fl!("settings_duplicates_minimal_size_cache_prehash_label"));
.set_label(&flg!("settings_duplicates_minimal_size_cache_prehash_label"));
self.check_button_settings_hide_hard_links
.set_tooltip_text(Some(&fl!("settings_duplicates_hide_hard_link_button_tooltip")));
.set_tooltip_text(Some(&flg!("settings_duplicates_hide_hard_link_button_tooltip")));
self.entry_settings_cache_file_minimal_size
.set_tooltip_text(Some(&fl!("settings_duplicates_minimal_size_entry_tooltip")));
.set_tooltip_text(Some(&flg!("settings_duplicates_minimal_size_entry_tooltip")));
self.check_button_settings_show_preview_duplicates
.set_tooltip_text(Some(&fl!("settings_multiple_image_preview_checkbutton_tooltip")));
.set_tooltip_text(Some(&flg!("settings_multiple_image_preview_checkbutton_tooltip")));
self.check_button_settings_duplicates_delete_outdated_cache
.set_tooltip_text(Some(&fl!("settings_multiple_delete_outdated_cache_checkbutton_tooltip")));
.set_tooltip_text(Some(&flg!("settings_multiple_delete_outdated_cache_checkbutton_tooltip")));
self.button_settings_duplicates_clear_cache
.set_tooltip_text(Some(&fl!("settings_multiple_clear_cache_button_tooltip")));
.set_tooltip_text(Some(&flg!("settings_multiple_clear_cache_button_tooltip")));
self.check_button_duplicates_use_prehash_cache
.set_tooltip_text(Some(&fl!("settings_duplicates_prehash_checkbutton_tooltip")));
.set_tooltip_text(Some(&flg!("settings_duplicates_prehash_checkbutton_tooltip")));
self.entry_settings_prehash_cache_file_minimal_size
.set_tooltip_text(Some(&fl!("settings_duplicates_prehash_minimal_entry_tooltip")));
.set_tooltip_text(Some(&flg!("settings_duplicates_prehash_minimal_entry_tooltip")));
self.check_button_settings_show_preview_similar_images
.set_label(&fl!("settings_multiple_image_preview_checkbutton"));
.set_label(&flg!("settings_multiple_image_preview_checkbutton"));
self.check_button_settings_similar_images_delete_outdated_cache
.set_label(&fl!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_similar_images_clear_cache.set_label(&fl!("settings_multiple_clear_cache_button"));
.set_label(&flg!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_similar_images_clear_cache.set_label(&flg!("settings_multiple_clear_cache_button"));
self.check_button_settings_show_preview_similar_images
.set_tooltip_text(Some(&fl!("settings_multiple_image_preview_checkbutton_tooltip")));
.set_tooltip_text(Some(&flg!("settings_multiple_image_preview_checkbutton_tooltip")));
self.check_button_settings_similar_images_delete_outdated_cache
.set_tooltip_text(Some(&fl!("settings_multiple_delete_outdated_cache_checkbutton_tooltip")));
.set_tooltip_text(Some(&flg!("settings_multiple_delete_outdated_cache_checkbutton_tooltip")));
self.button_settings_similar_images_clear_cache
.set_tooltip_text(Some(&fl!("settings_multiple_clear_cache_button_tooltip")));
.set_tooltip_text(Some(&flg!("settings_multiple_clear_cache_button_tooltip")));
self.check_button_settings_similar_videos_delete_outdated_cache
.set_label(&fl!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_similar_videos_clear_cache.set_label(&fl!("settings_multiple_clear_cache_button"));
.set_label(&flg!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_similar_videos_clear_cache.set_label(&flg!("settings_multiple_clear_cache_button"));
self.check_button_settings_similar_videos_delete_outdated_cache
.set_tooltip_text(Some(&fl!("settings_multiple_delete_outdated_cache_checkbutton_tooltip")));
.set_tooltip_text(Some(&flg!("settings_multiple_delete_outdated_cache_checkbutton_tooltip")));
self.button_settings_similar_videos_clear_cache
.set_tooltip_text(Some(&fl!("settings_multiple_clear_cache_button_tooltip")));
.set_tooltip_text(Some(&flg!("settings_multiple_clear_cache_button_tooltip")));
self.button_settings_save_configuration.set_label(&fl!("settings_saving_button"));
self.button_settings_load_configuration.set_label(&fl!("settings_loading_button"));
self.button_settings_reset_configuration.set_label(&fl!("settings_reset_button"));
self.button_settings_save_configuration.set_label(&flg!("settings_saving_button"));
self.button_settings_load_configuration.set_label(&flg!("settings_loading_button"));
self.button_settings_reset_configuration.set_label(&flg!("settings_reset_button"));
self.button_settings_save_configuration.set_tooltip_text(Some(&fl!("settings_saving_button_tooltip")));
self.button_settings_load_configuration.set_tooltip_text(Some(&fl!("settings_loading_button_tooltip")));
self.button_settings_reset_configuration.set_tooltip_text(Some(&fl!("settings_reset_button_tooltip")));
self.button_settings_save_configuration.set_tooltip_text(Some(&flg!("settings_saving_button_tooltip")));
self.button_settings_load_configuration.set_tooltip_text(Some(&flg!("settings_loading_button_tooltip")));
self.button_settings_reset_configuration.set_tooltip_text(Some(&flg!("settings_reset_button_tooltip")));
self.button_settings_open_cache_folder.set_label(&fl!("settings_folder_cache_open"));
self.button_settings_open_settings_folder.set_label(&fl!("settings_folder_settings_open"));
self.button_settings_open_cache_folder.set_label(&flg!("settings_folder_cache_open"));
self.button_settings_open_settings_folder.set_label(&flg!("settings_folder_settings_open"));
self.button_settings_open_cache_folder.set_tooltip_text(Some(&fl!("settings_folder_cache_open_tooltip")));
self.button_settings_open_cache_folder.set_tooltip_text(Some(&flg!("settings_folder_cache_open_tooltip")));
self.button_settings_open_settings_folder
.set_tooltip_text(Some(&fl!("settings_folder_settings_open_tooltip")));
.set_tooltip_text(Some(&flg!("settings_folder_settings_open_tooltip")));
let vec_children: Vec<gtk::Widget> = self.notebook_settings.children();
@ -241,10 +243,10 @@ impl GuiSettings {
// Change name of main notebook tabs
let names: [String; 4] = [
fl!("settings_notebook_general"),
fl!("settings_notebook_duplicates"),
fl!("settings_notebook_images"),
fl!("settings_notebook_videos"),
flg!("settings_notebook_general"),
flg!("settings_notebook_duplicates"),
flg!("settings_notebook_images"),
flg!("settings_notebook_videos"),
];
for (index, fl_thing) in names.iter().enumerate() {
self.notebook_settings

View File

@ -1,9 +1,9 @@
use gtk::prelude::*;
use gtk::{Bin, EventControllerKey, TreeView};
use crate::flg;
use crate::help_functions::get_custom_label_from_button_with_image;
use crate::notebook_enums::NotebookUpperEnum;
use czkawka_core::fl;
#[derive(Clone)]
pub struct GuiUpperNotebook {
@ -101,50 +101,50 @@ impl GuiUpperNotebook {
}
}
pub fn update_language(&self) {
self.check_button_recursive.set_label(&fl!("upper_recursive_button"));
self.check_button_recursive.set_tooltip_text(Some(&fl!("upper_recursive_button_tooltip")));
self.check_button_recursive.set_label(&flg!("upper_recursive_button"));
self.check_button_recursive.set_tooltip_text(Some(&flg!("upper_recursive_button_tooltip")));
get_custom_label_from_button_with_image(&self.buttons_manual_add_included_directory.clone().upcast::<Bin>()).set_text(&fl!("upper_manual_add_included_button"));
get_custom_label_from_button_with_image(&self.buttons_add_included_directory.clone().upcast::<Bin>()).set_text(&fl!("upper_add_included_button"));
get_custom_label_from_button_with_image(&self.buttons_remove_included_directory.clone().upcast::<Bin>()).set_text(&fl!("upper_remove_included_button"));
get_custom_label_from_button_with_image(&self.buttons_manual_add_excluded_directory.clone().upcast::<Bin>()).set_text(&fl!("upper_manual_add_excluded_button"));
get_custom_label_from_button_with_image(&self.buttons_add_excluded_directory.clone().upcast::<Bin>()).set_text(&fl!("upper_add_excluded_button"));
get_custom_label_from_button_with_image(&self.buttons_remove_excluded_directory.clone().upcast::<Bin>()).set_text(&fl!("upper_remove_excluded_button"));
get_custom_label_from_button_with_image(&self.buttons_manual_add_included_directory.clone().upcast::<Bin>()).set_text(&flg!("upper_manual_add_included_button"));
get_custom_label_from_button_with_image(&self.buttons_add_included_directory.clone().upcast::<Bin>()).set_text(&flg!("upper_add_included_button"));
get_custom_label_from_button_with_image(&self.buttons_remove_included_directory.clone().upcast::<Bin>()).set_text(&flg!("upper_remove_included_button"));
get_custom_label_from_button_with_image(&self.buttons_manual_add_excluded_directory.clone().upcast::<Bin>()).set_text(&flg!("upper_manual_add_excluded_button"));
get_custom_label_from_button_with_image(&self.buttons_add_excluded_directory.clone().upcast::<Bin>()).set_text(&flg!("upper_add_excluded_button"));
get_custom_label_from_button_with_image(&self.buttons_remove_excluded_directory.clone().upcast::<Bin>()).set_text(&flg!("upper_remove_excluded_button"));
// GTK 4
// get_custom_label_from_label_with_image(&self.buttons_manual_add_included_directory.clone()).set_text(&fl!("upper_manual_add_included_button"));
// get_custom_label_from_label_with_image(&self.buttons_add_included_directory.clone()).set_text(&fl!("upper_add_included_button"));
// get_custom_label_from_label_with_image(&self.buttons_remove_included_directory.clone()).set_text(&fl!("upper_remove_included_button"));
// get_custom_label_from_label_with_image(&self.buttons_manual_add_excluded_directory.clone()).set_text(&fl!("upper_manual_add_excluded_button"));
// get_custom_label_from_label_with_image(&self.buttons_add_excluded_directory.clone()).set_text(&fl!("upper_add_excluded_button"));
// get_custom_label_from_label_with_image(&self.buttons_remove_excluded_directory.clone()).set_text(&fl!("upper_remove_excluded_button"));
// get_custom_label_from_label_with_image(&self.buttons_manual_add_included_directory.clone()).set_text(&flg!("upper_manual_add_included_button"));
// get_custom_label_from_label_with_image(&self.buttons_add_included_directory.clone()).set_text(&flg!("upper_add_included_button"));
// get_custom_label_from_label_with_image(&self.buttons_remove_included_directory.clone()).set_text(&flg!("upper_remove_included_button"));
// get_custom_label_from_label_with_image(&self.buttons_manual_add_excluded_directory.clone()).set_text(&flg!("upper_manual_add_excluded_button"));
// get_custom_label_from_label_with_image(&self.buttons_add_excluded_directory.clone()).set_text(&flg!("upper_add_excluded_button"));
// get_custom_label_from_label_with_image(&self.buttons_remove_excluded_directory.clone()).set_text(&flg!("upper_remove_excluded_button"));
self.buttons_manual_add_included_directory
.set_tooltip_text(Some(&fl!("upper_manual_add_included_button_tooltip")));
self.buttons_add_included_directory.set_tooltip_text(Some(&fl!("upper_add_included_button_tooltip")));
self.buttons_remove_included_directory.set_tooltip_text(Some(&fl!("upper_remove_included_button_tooltip")));
.set_tooltip_text(Some(&flg!("upper_manual_add_included_button_tooltip")));
self.buttons_add_included_directory.set_tooltip_text(Some(&flg!("upper_add_included_button_tooltip")));
self.buttons_remove_included_directory.set_tooltip_text(Some(&flg!("upper_remove_included_button_tooltip")));
self.buttons_manual_add_excluded_directory
.set_tooltip_text(Some(&fl!("upper_manual_add_excluded_button_tooltip")));
self.buttons_add_excluded_directory.set_tooltip_text(Some(&fl!("upper_add_excluded_button_tooltip")));
self.buttons_remove_excluded_directory.set_tooltip_text(Some(&fl!("upper_remove_excluded_button_tooltip")));
.set_tooltip_text(Some(&flg!("upper_manual_add_excluded_button_tooltip")));
self.buttons_add_excluded_directory.set_tooltip_text(Some(&flg!("upper_add_excluded_button_tooltip")));
self.buttons_remove_excluded_directory.set_tooltip_text(Some(&flg!("upper_remove_excluded_button_tooltip")));
self.label_allowed_extensions.set_tooltip_text(Some(&fl!("upper_allowed_extensions_tooltip")));
self.entry_allowed_extensions.set_tooltip_text(Some(&fl!("upper_allowed_extensions_tooltip")));
self.label_excluded_items.set_tooltip_text(Some(&fl!("upper_excluded_items_tooltip")));
self.entry_excluded_items.set_tooltip_text(Some(&fl!("upper_excluded_items_tooltip")));
self.label_allowed_extensions.set_tooltip_text(Some(&flg!("upper_allowed_extensions_tooltip")));
self.entry_allowed_extensions.set_tooltip_text(Some(&flg!("upper_allowed_extensions_tooltip")));
self.label_excluded_items.set_tooltip_text(Some(&flg!("upper_excluded_items_tooltip")));
self.entry_excluded_items.set_tooltip_text(Some(&flg!("upper_excluded_items_tooltip")));
self.label_excluded_items.set_label(&fl!("upper_excluded_items"));
self.label_allowed_extensions.set_label(&fl!("upper_allowed_extensions"));
self.label_excluded_items.set_label(&flg!("upper_excluded_items"));
self.label_allowed_extensions.set_label(&flg!("upper_allowed_extensions"));
self.label_general_size_bytes.set_label(&fl!("main_label_size_bytes"));
self.label_general_min_size.set_label(&fl!("main_label_min_size"));
self.label_general_max_size.set_label(&fl!("main_label_max_size"));
self.label_general_size_bytes.set_label(&flg!("main_label_size_bytes"));
self.label_general_min_size.set_label(&flg!("main_label_min_size"));
self.label_general_max_size.set_label(&flg!("main_label_max_size"));
self.label_general_size_bytes.set_tooltip_text(Some(&fl!("main_label_size_bytes_tooltip")));
self.label_general_min_size.set_tooltip_text(Some(&fl!("main_label_size_bytes_tooltip")));
self.label_general_max_size.set_tooltip_text(Some(&fl!("main_label_size_bytes_tooltip")));
self.entry_general_minimal_size.set_tooltip_text(Some(&fl!("main_label_size_bytes_tooltip")));
self.entry_general_maximal_size.set_tooltip_text(Some(&fl!("main_label_size_bytes_tooltip")));
self.label_general_size_bytes.set_tooltip_text(Some(&flg!("main_label_size_bytes_tooltip")));
self.label_general_min_size.set_tooltip_text(Some(&flg!("main_label_size_bytes_tooltip")));
self.label_general_max_size.set_tooltip_text(Some(&flg!("main_label_size_bytes_tooltip")));
self.entry_general_minimal_size.set_tooltip_text(Some(&flg!("main_label_size_bytes_tooltip")));
self.entry_general_maximal_size.set_tooltip_text(Some(&flg!("main_label_size_bytes_tooltip")));
let vec_children: Vec<gtk::Widget> = self.notebook_upper.children();
@ -153,9 +153,9 @@ impl GuiUpperNotebook {
// Change name of upper notebook tabs
for (upper_enum, fl_thing) in [
(NotebookUpperEnum::ItemsConfiguration as usize, fl!("upper_notebook_items_configuration")),
(NotebookUpperEnum::ExcludedDirectories as usize, fl!("upper_notebook_excluded_directories")),
(NotebookUpperEnum::IncludedDirectories as usize, fl!("upper_notebook_included_directories")),
(NotebookUpperEnum::ItemsConfiguration as usize, flg!("upper_notebook_items_configuration")),
(NotebookUpperEnum::ExcludedDirectories as usize, flg!("upper_notebook_excluded_directories")),
(NotebookUpperEnum::IncludedDirectories as usize, flg!("upper_notebook_included_directories")),
] {
self.notebook_upper
.tab_label(&vec_children[upper_enum])
@ -166,7 +166,10 @@ impl GuiUpperNotebook {
}
let names_of_columns = [
vec![fl!("upper_tree_view_included_folder_column_title"), fl!("upper_tree_view_included_reference_column_title")], // Included folders
vec![
flg!("upper_tree_view_included_folder_column_title"),
flg!("upper_tree_view_included_reference_column_title"),
], // Included folders
];
for (notebook_index, tree_view) in [self.tree_view_included_directories.clone()].iter().enumerate() {

View File

@ -9,8 +9,10 @@ use image::imageops::FilterType;
use image::DynamicImage;
use image::GenericImageView;
use crate::flg;
use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::BrokenFiles;
use czkawka_core::common_dir_traversal;
use czkawka_core::common_messages::Messages;
use czkawka_core::duplicate::DuplicateFinder;
use czkawka_core::empty_files::EmptyFiles;
@ -20,7 +22,6 @@ use czkawka_core::same_music::SameMusic;
use czkawka_core::similar_images::SimilarImages;
use czkawka_core::similar_videos::SimilarVideos;
use czkawka_core::temporary::Temporary;
use czkawka_core::{common_dir_traversal, fl};
use crate::notebook_enums::{NotebookMainEnum, NotebookUpperEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
@ -395,7 +396,7 @@ pub fn split_path(path: &Path) -> (String, String) {
pub fn print_text_messages_to_text_view(text_messages: &Messages, text_view: &gtk::TextView) {
let mut messages: String = String::from("");
if !text_messages.messages.is_empty() {
messages += format!("############### {}({}) ###############\n", fl!("text_view_messages"), text_messages.messages.len()).as_str();
messages += format!("############### {}({}) ###############\n", flg!("text_view_messages"), text_messages.messages.len()).as_str();
}
for text in &text_messages.messages {
messages += text.as_str();
@ -405,7 +406,7 @@ pub fn print_text_messages_to_text_view(text_messages: &Messages, text_view: &gt
// messages += "\n";
// }
if !text_messages.warnings.is_empty() {
messages += format!("############### {}({}) ###############\n", fl!("text_view_warnings"), text_messages.warnings.len()).as_str();
messages += format!("############### {}({}) ###############\n", flg!("text_view_warnings"), text_messages.warnings.len()).as_str();
}
for text in &text_messages.warnings {
messages += text.as_str();
@ -415,7 +416,7 @@ pub fn print_text_messages_to_text_view(text_messages: &Messages, text_view: &gt
// messages += "\n";
// }
if !text_messages.errors.is_empty() {
messages += format!("############### {}({}) ###############\n", fl!("text_view_errors"), text_messages.errors.len()).as_str();
messages += format!("############### {}({}) ###############\n", flg!("text_view_errors"), text_messages.errors.len()).as_str();
}
for text in &text_messages.errors {
messages += text.as_str();
@ -463,8 +464,8 @@ pub fn hide_all_buttons(buttons_array: &[Widget]) {
pub fn get_text_from_invalid_symlink_cause(error: &common_dir_traversal::ErrorType) -> String {
match error {
common_dir_traversal::ErrorType::InfiniteRecursion => fl!("invalid_symlink_infinite_recursion"),
common_dir_traversal::ErrorType::NonExistentFile => fl!("invalid_symlink_non_existent_destination"),
common_dir_traversal::ErrorType::InfiniteRecursion => flg!("invalid_symlink_infinite_recursion"),
common_dir_traversal::ErrorType::NonExistentFile => flg!("invalid_symlink_non_existent_destination"),
}
}

View File

@ -11,7 +11,7 @@ use gtk::{CheckButton, Image, SelectionMode, TextView, TreeView};
use image::imageops::FilterType;
use image::GenericImageView;
use czkawka_core::fl;
use crate::flg;
use czkawka_core::similar_images::{IMAGE_RS_EXTENSIONS, RAW_IMAGE_EXTENSIONS, SIMILAR_VALUES};
use czkawka_core::similar_videos::MAX_TOLERANCE;
@ -23,7 +23,7 @@ use crate::help_combo_box::{
};
use crate::help_functions::*;
use crate::language_functions::LANGUAGES_ALL;
use crate::localizer::generate_translation_hashmap;
use crate::localizer_core::generate_translation_hashmap;
use crate::notebook_enums::NotebookMainEnum;
use crate::opening_selecting_records::*;
@ -697,7 +697,7 @@ fn show_preview(
} else if let Err(e) = fs::create_dir_all(cache_dir) {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"preview_failed_to_create_cache_dir",
generate_translation_hashmap(vec![("name", cache_dir.display().to_string()), ("reason", e.to_string())])
)
@ -733,7 +733,7 @@ fn show_preview(
Err(e) => {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"preview_temporary_file",
generate_translation_hashmap(vec![("name", file_name.to_string()), ("reason", e.to_string())])
)
@ -748,7 +748,7 @@ fn show_preview(
None => {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"preview_temporary_file",
generate_translation_hashmap(vec![("name", file_name.to_string()), ("reason", "None".to_string())])
)
@ -761,7 +761,7 @@ fn show_preview(
if img.width() == 0 || img.height() == 0 {
add_text_to_text_view(
text_view_errors,
fl!("preview_0_size", generate_translation_hashmap(vec![("name", file_name.to_string())])).as_str(),
flg!("preview_0_size", generate_translation_hashmap(vec![("name", file_name.to_string())])).as_str(),
);
break 'dir;
}
@ -773,7 +773,7 @@ fn show_preview(
if let Err(e) = img.save(&file_dir) {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"preview_temporary_image_save",
generate_translation_hashmap(vec![("name", file_dir.display().to_string()), ("reason", e.to_string())])
)
@ -793,7 +793,7 @@ fn show_preview(
if let Err(e) = fs::remove_file(&file_dir) {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"preview_temporary_image_remove",
generate_translation_hashmap(vec![("name", file_dir.display().to_string()), ("reason", e.to_string())])
)

View File

@ -0,0 +1,34 @@
use i18n_embed::{
fluent::{fluent_language_loader, FluentLanguageLoader},
DefaultLocalizer, LanguageLoader, Localizer,
};
use once_cell::sync::Lazy;
use rust_embed::RustEmbed;
#[derive(RustEmbed)]
#[folder = "i18n/"]
struct Localizations;
pub static LANGUAGE_LOADER_GUI: Lazy<FluentLanguageLoader> = Lazy::new(|| {
let loader: FluentLanguageLoader = fluent_language_loader!();
loader.load_fallback_language(&Localizations).expect("Error while loading fallback language");
loader
});
#[macro_export]
macro_rules! flg {
($message_id:literal) => {{
i18n_embed_fl::fl!($crate::localizer_gui::LANGUAGE_LOADER_GUI, $message_id)
}};
($message_id:literal, $($args:expr),*) => {{
i18n_embed_fl::fl!($crate::localizer_gui::LANGUAGE_LOADER_GUI, $message_id, $($args), *)
}};
}
// Get the `Localizer` to be used for localizing this library.
pub fn localizer_gui() -> Box<dyn Localizer> {
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER_GUI, &Localizations))
}

View File

@ -42,6 +42,7 @@ mod help_combo_box;
mod help_functions;
mod initialize_gui;
mod language_functions;
mod localizer_gui;
mod notebook_enums;
mod opening_selecting_records;
mod saving_loading;

View File

@ -8,15 +8,15 @@ use directories_next::ProjectDirs;
use gtk::prelude::*;
use gtk::{ComboBoxText, ScrolledWindow, TextView};
use crate::flg;
use crate::gui_structs::gui_main_notebook::GuiMainNotebook;
use czkawka_core::fl;
use czkawka_core::similar_images::SIMILAR_VALUES;
use crate::gui_structs::gui_settings::GuiSettings;
use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook;
use crate::help_functions::*;
use crate::language_functions::{get_language_from_combo_box_text, LANGUAGES_ALL};
use crate::localizer::generate_translation_hashmap;
use crate::localizer_core::generate_translation_hashmap;
// TODO organize this better, add specific functions that will allow to load from files specific strings
const SAVE_FILE_NAME: &str = "czkawka_gui_config_4.txt";
@ -107,7 +107,7 @@ impl LoadSaveStruct {
} else {
add_text_to_text_view(
&self.text_view,
&fl!(
&flg!(
"saving_loading_invalid_string",
generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))])
),
@ -133,7 +133,7 @@ impl LoadSaveStruct {
} else {
add_text_to_text_view(
&self.text_view,
&fl!(
&flg!(
"saving_loading_invalid_int",
generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))])
),
@ -156,7 +156,7 @@ impl LoadSaveStruct {
} else {
add_text_to_text_view(
&self.text_view,
&fl!(
&flg!(
"saving_loading_decode_problem_bool",
generate_translation_hashmap(vec![("key", key), ("result", item[0].to_string())])
),
@ -166,7 +166,7 @@ impl LoadSaveStruct {
} else {
add_text_to_text_view(
&self.text_view,
&fl!(
&flg!(
"saving_loading_invalid_bool",
generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))])
),
@ -183,7 +183,7 @@ impl LoadSaveStruct {
if self.loaded_items.contains_key(&key) {
add_text_to_text_view(
&self.text_view,
&fl!("saving_loading_saving_same_keys", generate_translation_hashmap(vec![("key", key.clone())])),
&flg!("saving_loading_saving_same_keys", generate_translation_hashmap(vec![("key", key.clone())])),
);
}
@ -219,7 +219,7 @@ impl LoadSaveStruct {
if !config_dir.is_dir() {
add_text_to_text_view(
text_view_errors,
&fl!(
&flg!(
"saving_loading_folder_config_instead_file",
generate_translation_hashmap(vec![("path", config_dir.display().to_string())])
),
@ -229,7 +229,7 @@ impl LoadSaveStruct {
} else if let Err(e) = fs::create_dir_all(config_dir) {
add_text_to_text_view(
text_view_errors,
&fl!(
&flg!(
"saving_loading_failed_to_create_configuration_folder",
generate_translation_hashmap(vec![("path", config_dir.display().to_string()), ("reason", e.to_string())])
),
@ -242,7 +242,7 @@ impl LoadSaveStruct {
Err(e) => {
add_text_to_text_view(
text_view_errors,
&fl!(
&flg!(
"saving_loading_failed_to_create_config_file",
generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())])
),
@ -257,7 +257,7 @@ impl LoadSaveStruct {
// Don't show errors when there is no configuration file when starting app
add_text_to_text_view(
text_view_errors,
&fl!(
&flg!(
"saving_loading_failed_to_read_config_file",
generate_translation_hashmap(vec![("path", config_file.display().to_string())])
),
@ -271,7 +271,7 @@ impl LoadSaveStruct {
Err(e) => {
add_text_to_text_view(
text_view_errors,
&fl!(
&flg!(
"saving_loading_failed_to_create_config_file",
generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())])
),
@ -282,7 +282,7 @@ impl LoadSaveStruct {
return Some((config_file_handler, config_file));
}
} else {
add_text_to_text_view(text_view_errors, fl!("saving_loading_failed_to_get_home_directory").as_str());
add_text_to_text_view(text_view_errors, flg!("saving_loading_failed_to_get_home_directory").as_str());
}
None
}
@ -293,7 +293,7 @@ impl LoadSaveStruct {
if let Err(e) = config_file_handler.read_to_string(&mut loaded_data) {
add_text_to_text_view(
text_view_errors,
&fl!(
&flg!(
"saving_loading_failed_to_read_data_from_file",
generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())])
),
@ -313,7 +313,7 @@ impl LoadSaveStruct {
} else {
add_text_to_text_view(
text_view_errors,
&fl!(
&flg!(
"saving_loading_orphan_data",
generate_translation_hashmap(vec![("data", line.to_string()), ("index", index.to_string())])
),
@ -326,13 +326,13 @@ impl LoadSaveStruct {
if !hashmap_sl.contains_key(setting) {
add_text_to_text_view(
text_view_errors,
&fl!("saving_loading_not_valid", generate_translation_hashmap(vec![("data", setting.to_string())])),
&flg!("saving_loading_not_valid", generate_translation_hashmap(vec![("data", setting.to_string())])),
);
}
}
if manual_execution {
add_text_to_text_view(text_view_errors, &fl!("saving_loading_loading_success"));
add_text_to_text_view(text_view_errors, &flg!("saving_loading_loading_success"));
}
}
}
@ -365,7 +365,7 @@ impl LoadSaveStruct {
if data_saved {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"saving_loading_saving_success",
generate_translation_hashmap(vec![("name", config_file.display().to_string())])
)
@ -374,7 +374,7 @@ impl LoadSaveStruct {
} else {
add_text_to_text_view(
text_view_errors,
fl!(
flg!(
"saving_loading_saving_failure",
generate_translation_hashmap(vec![("name", config_file.display().to_string())])
)
@ -934,6 +934,6 @@ pub fn reset_configuration(manual_clearing: bool, upper_notebook: &GuiUpperNoteb
main_notebook.scale_similarity_similar_videos.set_value(DEFAULT_SIMILAR_VIDEOS_SIMILARITY as f64);
}
if manual_clearing {
add_text_to_text_view(&text_view_errors, &fl!("saving_loading_reset_configuration"));
add_text_to_text_view(&text_view_errors, &flg!("saving_loading_reset_configuration"));
}
}

View File

@ -37,7 +37,7 @@ Author: Rafał Mikrut
<property name="window-position">center</property>
<property name="type-hint">dialog</property>
<property name="program-name">Czkawka</property>
<property name="version">3.3.1</property>
<property name="version">4.0.0</property>
<property name="comments" translatable="yes">2020 - 2022 Rafał Mikrut(qarmin)
This program is free to use and will always be.

View File

@ -1938,7 +1938,7 @@ Author: Rafał Mikrut
<property name="can-focus">True</property>
<property name="editable">False</property>
<property name="has-frame">False</property>
<property name="text" translatable="yes">Czkawka 3.3.1</property>
<property name="text" translatable="yes">Czkawka 4.0.0</property>
<property name="xalign">1</property>
<property name="shadow-type">none</property>
<property name="caps-lock-warning">False</property>

View File

@ -19,7 +19,7 @@
</screenshot>
</screenshots>
<releases>
<release version="3.3.1" date="2021-11-22"/>
<release version="4.0.0" date="2021-01-20"/>
</releases>
<content_rating type="oars-1.0"/>
<developer_name>Rafał Mikrut</developer_name>

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1 +0,0 @@
czkawka_gui.ftl

View File

@ -1,5 +1,5 @@
#!/bin/bash
NUMBER="3.3.1"
NUMBER="4.0.0"
CZKAWKA_PATH="/home/rafal"
cd "$CZKAWKA_PATH"

View File

@ -1,5 +1,5 @@
#!/bin/bash
NUMBER="3.3.1"
NUMBER="4.0.0"
CZKAWKA_PATH="/home/rafal"
cd "$CZKAWKA_PATH"

View File

@ -1,6 +1,6 @@
name: czkawka # you probably want to 'snapcraft register <name>'
base: core20 # the base snap is the execution environment for this snap
version: '3.3.1' # just for humans, typically '1.2+git' or '1.3.2'
version: '4.0.0' # just for humans, typically '1.2+git' or '1.3.2'
summary: Czkawka - fast data cleaner written in Rust # 79 char long summary
description: |
Czkawka is very fast and feature rich cleaner which finds file duplicates, empty folders and files, duplicated music, similar images or the biggest files in selected directories.