1
0
Fork 0
mirror of synced 2024-04-26 16:52:19 +12:00

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]] [[package]]
name = "czkawka_cli" name = "czkawka_cli"
version = "3.3.1" version = "4.0.0"
dependencies = [ dependencies = [
"czkawka_core", "czkawka_core",
"img_hash", "img_hash",
@ -564,7 +564,7 @@ dependencies = [
[[package]] [[package]]
name = "czkawka_core" name = "czkawka_core"
version = "3.3.1" version = "4.0.0"
dependencies = [ dependencies = [
"audiotags", "audiotags",
"bincode", "bincode",
@ -598,7 +598,7 @@ dependencies = [
[[package]] [[package]]
name = "czkawka_gui" name = "czkawka_gui"
version = "3.3.1" version = "4.0.0"
dependencies = [ dependencies = [
"chrono", "chrono",
"crossbeam-channel", "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) - 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 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) - Add support for finding similar videos - [#460](https://github.com/qarmin/czkawka/pull/460)

View file

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

View file

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

View file

@ -9,5 +9,5 @@ fallback_language = "en"
# (Required) The path to the assets directory. # (Required) The path to the assets directory.
# The paths inside the assets directory should be structured like so: # The paths inside the assets directory should be structured like so:
# `assets_dir/{language}/{domain}.ftl` # `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_items::ExcludedItems;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::common_traits::{DebugPrint, PrintResults, SaveResults}; use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
use crate::fl; use crate::flc;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
#[derive(Debug)] #[derive(Debug)]
pub struct ProgressData { pub struct ProgressData {
@ -173,7 +173,7 @@ impl BigFile {
let read_dir = match fs::read_dir(&current_folder) { let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_open_dir", "core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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 { let entry_data = match entry {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_entry_dir", "core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_metadata_dir", "core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t, Ok(t) => t,
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_not_utf8_name", "core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) 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(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_modified_before_epoch", "core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
)); ));
@ -257,7 +257,7 @@ impl BigFile {
} }
}, },
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_no_modification_date", "core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) 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_items::ExcludedItems;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::common_traits::*; use crate::common_traits::*;
use crate::fl; use crate::flc;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
use crate::similar_images::{AUDIO_FILES_EXTENSIONS, IMAGE_RS_BROKEN_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS}; use crate::similar_images::{AUDIO_FILES_EXTENSIONS, IMAGE_RS_BROKEN_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS};
#[derive(Debug)] #[derive(Debug)]
@ -218,7 +218,7 @@ impl BrokenFiles {
let read_dir = match fs::read_dir(&current_folder) { let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_open_dir", "core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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 { let entry_data = match entry {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_entry_dir", "core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_metadata_dir", "core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t, Ok(t) => t,
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_not_utf8_name", "core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) 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(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_modified_before_epoch", "core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
)); ));
@ -306,7 +306,7 @@ impl BrokenFiles {
} }
}, },
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_no_modification_date", "core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) 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_directory::Directories;
use crate::common_extensions::Extensions; use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
use crate::fl; use crate::flc;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
#[derive(Debug)] #[derive(Debug)]
pub struct ProgressData { pub struct ProgressData {
@ -372,7 +372,7 @@ where
let read_dir = match fs::read_dir(&current_folder) { let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_open_dir", "core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
)); ));
@ -385,7 +385,7 @@ where
let entry_data = match entry { let entry_data = match entry {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_entry_dir", "core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_metadata_dir", "core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_folder_modified_before_epoch", "core_folder_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_folder.display().to_string())]) generate_translation_hashmap(vec![("name", current_folder.display().to_string())])
)); ));
@ -444,7 +444,7 @@ where
} }
}, },
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_folder_no_modification_date", "core_folder_no_modification_date",
generate_translation_hashmap(vec![("name", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t, Ok(t) => t,
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_not_utf8_name", "core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) 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(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_modified_before_epoch", "core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
)); ));
@ -495,7 +495,7 @@ where
} }
}, },
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_no_modification_date", "core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) 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() { let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t, Ok(t) => t,
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_not_utf8_name", "core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) 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(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_modified_before_epoch", "core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
)); ));
@ -589,7 +589,7 @@ where
} }
}, },
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_no_modification_date", "core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) 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::Common;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::fl; use crate::flc;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
#[derive(Clone, Default)] #[derive(Clone, Default)]
pub struct Directories { pub struct Directories {
@ -27,7 +27,7 @@ impl Directories {
let start_time: SystemTime = SystemTime::now(); let start_time: SystemTime = SystemTime::now();
if included_directory.is_empty() { 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; return false;
} }
@ -36,7 +36,7 @@ impl Directories {
let mut checked_directories: Vec<PathBuf> = Vec::new(); let mut checked_directories: Vec<PathBuf> = Vec::new();
for directory in directories { for directory in directories {
if directory.to_string_lossy().contains('*') { if directory.to_string_lossy().contains('*') {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_wildcard_no_supported", "core_directory_wildcard_no_supported",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
@ -45,7 +45,7 @@ impl Directories {
#[cfg(not(target_family = "windows"))] #[cfg(not(target_family = "windows"))]
if directory.is_relative() { if directory.is_relative() {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_relative_path", "core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
@ -53,7 +53,7 @@ impl Directories {
} }
#[cfg(target_family = "windows")] #[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") { if directory.is_relative() && !directory.starts_with("\\") {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_relative_path", "core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
@ -61,14 +61,14 @@ impl Directories {
} }
if !directory.exists() { if !directory.exists() {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_must_exists", "core_directory_must_exists",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
continue; continue;
} }
if !directory.is_dir() { if !directory.is_dir() {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_must_be_directory", "core_directory_must_be_directory",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
@ -78,7 +78,7 @@ impl Directories {
} }
if checked_directories.is_empty() { 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; return false;
} }
@ -101,11 +101,11 @@ impl Directories {
for directory in directories { for directory in directories {
let directory_as_string = directory.to_string_lossy(); let directory_as_string = directory.to_string_lossy();
if directory_as_string == "/" { 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; break;
} }
if directory_as_string.contains('*') { if directory_as_string.contains('*') {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_wildcard_no_supported", "core_directory_wildcard_no_supported",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
@ -113,7 +113,7 @@ impl Directories {
} }
#[cfg(not(target_family = "windows"))] #[cfg(not(target_family = "windows"))]
if directory.is_relative() { if directory.is_relative() {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_relative_path", "core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
@ -121,7 +121,7 @@ impl Directories {
} }
#[cfg(target_family = "windows")] #[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") { if directory.is_relative() && !directory.starts_with("\\") {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_relative_path", "core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
@ -133,7 +133,7 @@ impl Directories {
continue; continue;
} }
if !directory.is_dir() { if !directory.is_dir() {
text_messages.warnings.push(fl!( text_messages.warnings.push(flc!(
"core_directory_must_be_directory", "core_directory_must_be_directory",
generate_translation_hashmap(vec![("path", directory.display().to_string())]) generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
@ -276,7 +276,7 @@ impl Directories {
} }
if self.included_directories.is_empty() { if self.included_directories.is_empty() {
text_messages.errors.push(fl!("core_directory_overlap")); text_messages.errors.push(flc!("core_directory_overlap"));
return false; return false;
} }

View file

@ -26,6 +26,8 @@ use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::common_traits::*; use crate::common_traits::*;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(PartialEq, Eq, Clone, Debug, Copy)] #[derive(PartialEq, Eq, Clone, Debug, Copy)]
pub enum HashType { 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>>> { 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!( text_messages.messages.push(flc!(
"Properly loaded {} cache entries.", "core_loading_from_cache",
hashmap_loaded_entries.values().map(|e| e.len()).sum::<usize>() generate_translation_hashmap(vec![("number", hashmap_loaded_entries.values().map(|e| e.len()).sum::<usize>().to_string())])
)); ));
return Some(hashmap_loaded_entries); return Some(hashmap_loaded_entries);

View file

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

View file

@ -8,10 +8,10 @@ use once_cell::sync::Lazy;
use rust_embed::RustEmbed; use rust_embed::RustEmbed;
#[derive(RustEmbed)] #[derive(RustEmbed)]
#[folder = "../i18n/"] #[folder = "i18n/"]
struct Localizations; 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!(); let loader: FluentLanguageLoader = fluent_language_loader!();
loader.load_fallback_language(&Localizations).expect("Error while loading fallback language"); 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_export]
macro_rules! fl { macro_rules! flc {
($message_id:literal) => {{ ($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),*) => {{ ($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. // Get the `Localizer` to be used for localizing this library.
pub fn localizer() -> Box<dyn Localizer> { pub fn localizer_core() -> Box<dyn Localizer> {
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations)) Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER_CORE, &Localizations))
} }
pub fn generate_translation_hashmap(vec: Vec<(&'static str, String)>) -> HashMap<&'static str, String> { 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 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_items::ExcludedItems;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::common_traits::{DebugPrint, PrintResults, SaveResults}; use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
use crate::fl; use crate::flc;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
pub const RAW_IMAGE_EXTENSIONS: [&str; 24] = [ 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", ".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) { let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_open_dir", "core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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 { let entry_data = match entry {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_entry_dir", "core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_metadata_dir", "core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t, Ok(t) => t,
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_not_utf8_name", "core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) 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(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_modified_before_epoch", "core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
)); ));
@ -433,7 +433,7 @@ impl SimilarImages {
} }
}, },
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_no_modification_date", "core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) 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)] // #[cfg(debug_assertions)]
// { // {
// if *h <= SIMILAR_VALUES[index_preset][0] { // 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] { // } 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] { // } 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] { // } 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] { // } 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] { // } else if *h <= SIMILAR_VALUES[index_preset][5] {
// format!("{} {}", fl!("core_similarity_minimal"), *h) // format!("{} {}", flc!("core_similarity_minimal"), *h)
// } else { // } else {
// panic!(); // panic!();
// } // }
@ -1167,17 +1167,17 @@ pub fn get_string_from_similarity(similarity: &Similarity, hash_size: u8) -> Str
// #[cfg(not(debug_assertions))] // #[cfg(not(debug_assertions))]
{ {
if *h <= SIMILAR_VALUES[index_preset][0] { 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] { } else if *h <= SIMILAR_VALUES[index_preset][1] {
fl!("core_similarity_high") flc!("core_similarity_high")
} else if *h <= SIMILAR_VALUES[index_preset][2] { } else if *h <= SIMILAR_VALUES[index_preset][2] {
fl!("core_similarity_medium") flc!("core_similarity_medium")
} else if *h <= SIMILAR_VALUES[index_preset][3] { } else if *h <= SIMILAR_VALUES[index_preset][3] {
fl!("core_similarity_small") flc!("core_similarity_small")
} else if *h <= SIMILAR_VALUES[index_preset][4] { } 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] { } else if *h <= SIMILAR_VALUES[index_preset][5] {
fl!("core_similarity_minimal") flc!("core_similarity_minimal")
} else { } else {
panic!(); panic!();
} }

View file

@ -23,8 +23,8 @@ use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::common_traits::{DebugPrint, PrintResults, SaveResults}; use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
use crate::fl; use crate::flc;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
use crate::similar_images::VIDEO_FILES_EXTENSIONS; use crate::similar_images::VIDEO_FILES_EXTENSIONS;
pub const MAX_TOLERANCE: i32 = 20; pub const MAX_TOLERANCE: i32 = 20;
@ -197,8 +197,8 @@ impl SimilarVideos {
/// Public function used by CLI to search for empty folders /// 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>>) { 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() { if !check_if_ffmpeg_is_installed() {
self.text_messages.errors.push(fl!("core_ffmpeg_not_found")); self.text_messages.errors.push(flc!("core_ffmpeg_not_found"));
self.text_messages.errors.push(fl!( self.text_messages.errors.push(flc!(
"core_ffmpeg_missing_in_snap", "core_ffmpeg_missing_in_snap",
generate_translation_hashmap(vec![("url", "https://github.com/snapcrafters/ffmpeg/issues/73".to_string())]) 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) { let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_open_dir", "core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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 { let entry_data = match entry {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_entry_dir", "core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_metadata_dir", "core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t, Ok(t) => t,
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_not_utf8_name", "core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) 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(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_modified_before_epoch", "core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
)); ));
@ -371,7 +371,7 @@ impl SimilarVideos {
} }
}, },
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_no_modification_date", "core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) 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_items::ExcludedItems;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::common_traits::*; use crate::common_traits::*;
use crate::fl; use crate::flc;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
#[derive(Debug)] #[derive(Debug)]
pub struct ProgressData { pub struct ProgressData {
@ -175,7 +175,7 @@ impl Temporary {
let read_dir = match fs::read_dir(&current_folder) { let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_open_dir", "core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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 { let entry_data = match entry {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_entry_dir", "core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t, Ok(t) => t,
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_cannot_read_metadata_dir", "core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())]) 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() { let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t, Ok(t) => t,
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_not_utf8_name", "core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())]) 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(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
Err(_inspected) => { Err(_inspected) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_modified_before_epoch", "core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())]) generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
)); ));
@ -275,7 +275,7 @@ impl Temporary {
} }
}, },
Err(e) => { Err(e) => {
warnings.push(fl!( warnings.push(flc!(
"core_file_no_modification_date", "core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())]) generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
)); ));

View file

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

View file

@ -9,5 +9,5 @@ fallback_language = "en"
# (Required) The path to the assets directory. # (Required) The path to the assets directory.
# The paths inside the assets directory should be structured like so: # The paths inside the assets directory should be structured like so:
# `assets_dir/{language}/{domain}.ftl` # `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 titles
window_settings_title = Možnosti window_settings_title = Možnosti
window_main_title = Czkawka (Škytavka) 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 titles
window_settings_title = Optionen window_settings_title = Optionen
window_main_title = Czkawka (Schluckauf) 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 titles
window_settings_title = Settings window_settings_title = Settings
window_main_title = Czkawka (Hiccup) 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 titles
window_settings_title = Opciones window_settings_title = Opciones
window_main_title = Czkawka (Hipo) 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 titles
window_settings_title = Options window_settings_title = Options
window_main_title = Czkawka (Hoquet) 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 titles
window_settings_title = Impostazioni window_settings_title = Impostazioni
window_main_title = Singhiozzo 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 titles
window_settings_title = オプション window_settings_title = オプション
window_main_title = Czkawka (しゃっくり) 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 titles
window_settings_title = Opcje window_settings_title = Opcje
window_main_title = Czkawka 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 titles
window_settings_title = Opções window_settings_title = Opções
window_main_title = Czkawka (Soluço) 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 titles
window_settings_title = Опции window_settings_title = Опции
window_main_title = Czkawka (икота) 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 titles
window_settings_title = Опції window_settings_title = Опції
window_main_title = Czkawka (гикавка) 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::same_music::MusicSimilarity;
use czkawka_core::similar_images; use czkawka_core::similar_images;
use crate::fl; use crate::flg;
use crate::gui_structs::gui_data::GuiData; use crate::gui_structs::gui_data::GuiData;
use crate::help_combo_box::IMAGES_HASH_SIZE_COMBO_BOX; use crate::help_combo_box::IMAGES_HASH_SIZE_COMBO_BOX;
use crate::help_functions::*; use crate::help_functions::*;
use crate::notebook_enums::*; use crate::notebook_enums::*;
use crate::opening_selecting_records::*; 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>) { 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(); 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 { match msg {
Message::Duplicates(df) => { Message::Duplicates(df) => {
if df.get_stopped_search() { if df.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
if df.get_use_reference() { if df.get_use_reference() {
tree_view_duplicate_finder.selection().set_select_function(Some(Box::new(select_function_always_true))); 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_size = 0;
duplicates_group = information.number_of_groups_by_name; duplicates_group = information.number_of_groups_by_name;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_duplicates_name", "compute_found_duplicates_name",
generate_translation_hashmap(vec![("number_files", duplicates_number.to_string()), ("number_groups", duplicates_group.to_string())]) 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_size = information.lost_space_by_hash;
duplicates_group = information.number_of_groups_by_hash; duplicates_group = information.number_of_groups_by_hash;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_duplicates_hash_size", "compute_found_duplicates_hash_size",
generate_translation_hashmap(vec![ generate_translation_hashmap(vec![
("number_files", duplicates_number.to_string()), ("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_size = information.lost_space_by_size;
duplicates_group = information.number_of_groups_by_size; duplicates_group = information.number_of_groups_by_size;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_duplicates_hash_size", "compute_found_duplicates_hash_size",
generate_translation_hashmap(vec![ generate_translation_hashmap(vec![
("number_files", duplicates_number.to_string()), ("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) => { Message::EmptyFolders(ef) => {
if ef.get_stopped_search() { if ef.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
let information = ef.get_information(); let information = ef.get_information();
let text_messages = ef.get_text_messages(); 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; let empty_folder_number: usize = information.number_of_empty_folders;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_empty_folders", "compute_found_empty_folders",
generate_translation_hashmap(vec![("number_files", empty_folder_number.to_string()),]) 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) => { Message::EmptyFiles(vf) => {
if vf.get_stopped_search() { if vf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
let information = vf.get_information(); let information = vf.get_information();
let text_messages = vf.get_text_messages(); 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; let empty_files_number: usize = information.number_of_empty_files;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_empty_files", "compute_found_empty_files",
generate_translation_hashmap(vec![("number_files", empty_files_number.to_string()),]) 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) => { Message::BigFiles(bf) => {
if bf.get_stopped_search() { if bf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
let information = bf.get_information(); let information = bf.get_information();
let text_messages = bf.get_text_messages(); 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; let biggest_files_number: usize = information.number_of_real_files;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_big_files", "compute_found_big_files",
generate_translation_hashmap(vec![("number_files", biggest_files_number.to_string()),]) 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) => { Message::Temporary(tf) => {
if tf.get_stopped_search() { if tf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
let information = tf.get_information(); let information = tf.get_information();
let text_messages = tf.get_text_messages(); let text_messages = tf.get_text_messages();
let temporary_files_number: usize = information.number_of_temporary_files; let temporary_files_number: usize = information.number_of_temporary_files;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_temporary_files", "compute_found_temporary_files",
generate_translation_hashmap(vec![("number_files", temporary_files_number.to_string()),]) 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) => { Message::SimilarImages(sf) => {
if sf.get_stopped_search() { if sf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
if sf.get_use_reference() { if sf.get_use_reference() {
tree_view_similar_images_finder.selection().set_select_function(Some(Box::new(select_function_always_true))); 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; let found_any_duplicates = information.number_of_duplicates > 0;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_images", "compute_found_images",
generate_translation_hashmap(vec![ generate_translation_hashmap(vec![
("number_files", information.number_of_duplicates.to_string()), ("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) => { Message::SimilarVideos(ff) => {
if ff.get_stopped_search() { if ff.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
if ff.get_use_reference() { if ff.get_use_reference() {
tree_view_similar_videos_finder.selection().set_select_function(Some(Box::new(select_function_always_true))); 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; let found_any_duplicates = information.number_of_duplicates > 0;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_videos", "compute_found_videos",
generate_translation_hashmap(vec![ generate_translation_hashmap(vec![
("number_files", information.number_of_duplicates.to_string()), ("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) => { Message::SameMusic(mf) => {
if mf.get_stopped_search() { if mf.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
if mf.get_use_reference() { if mf.get_use_reference() {
tree_view_same_music_finder.selection().set_select_function(Some(Box::new(select_function_always_true))); 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; let same_music_number: usize = information.number_of_duplicates;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_music", "compute_found_music",
generate_translation_hashmap(vec![ generate_translation_hashmap(vec![
("number_files", information.number_of_duplicates.to_string()), ("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) => { Message::InvalidSymlinks(ifs) => {
if ifs.get_stopped_search() { if ifs.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
let information = ifs.get_information(); let information = ifs.get_information();
let text_messages = ifs.get_text_messages(); 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; let invalid_symlinks: usize = information.number_of_invalid_symlinks;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_invalid_symlinks", "compute_found_invalid_symlinks",
generate_translation_hashmap(vec![("number_files", invalid_symlinks.to_string()),]) 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) => { Message::BrokenFiles(br) => {
if br.get_stopped_search() { if br.get_stopped_search() {
entry_info.set_text(&fl!("compute_stopped_by_user")); entry_info.set_text(&flg!("compute_stopped_by_user"));
} else { } else {
let information = br.get_information(); let information = br.get_information();
let text_messages = br.get_text_messages(); 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; let broken_files_number: usize = information.number_of_broken_files;
entry_info.set_text( entry_info.set_text(
fl!( flg!(
"compute_found_broken_files", "compute_found_broken_files",
generate_translation_hashmap(vec![("number_files", broken_files_number.to_string()),]) 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::common::get_dynamic_image_from_raw_image;
use czkawka_core::fl;
use czkawka_core::similar_images::RAW_IMAGE_EXTENSIONS; use czkawka_core::similar_images::RAW_IMAGE_EXTENSIONS;
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{CheckButton, Image, ListStore, Orientation, ScrolledWindow, TreeIter, TreeModel, TreePath, TreeSelection}; 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, 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, NOTEBOOKS_INFOS,
}; };
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
const BIG_PREVIEW_SIZE: u32 = 600; const BIG_PREVIEW_SIZE: u32 = 600;
const SMALL_PREVIEW_SIZE: u32 = 100; 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))); check_button_right_preview_text.set_label(&format!("2. {}", get_max_file_name(&cache_all_images[1].0, 70)));
label_group_info.set_text( label_group_info.set_text(
fl!( flg!(
"compare_groups_number", "compare_groups_number",
generate_translation_hashmap(vec![ generate_translation_hashmap(vec![
("current_group", current_group.to_string()), ("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 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 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_left = image_compare_left.clone();
let image_compare_right = image_compare_right.clone(); let image_compare_right = image_compare_right.clone();

View file

@ -5,11 +5,11 @@ use std::fs::Metadata;
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{Align, CheckButton, Dialog, ResponseType, TextView}; use gtk::{Align, CheckButton, Dialog, ResponseType, TextView};
use czkawka_core::fl; use crate::flg;
use crate::gui_structs::gui_data::GuiData; use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*; use crate::help_functions::*;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
use crate::notebook_enums::*; use crate::notebook_enums::*;
// TODO add support for checking if really symlink doesn't point to correct directory/file // 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) { 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 dialog = gtk::Dialog::builder().title(&flg!("delete_title_dialog")).transient_for(window_main).modal(true).build();
let button_ok = dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok); let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel); 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 { let label2: gtk::Label = match number_of_selected_groups {
0 => gtk::Label::new(Some(&fl!( 0 => gtk::Label::new(Some(&flg!(
"delete_items_label", "delete_items_label",
generate_translation_hashmap(vec![("items", number_of_selected_items.to_string())]) 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", "delete_items_groups_label",
generate_translation_hashmap(vec![("items", number_of_selected_items.to_string()), ("groups", number_of_selected_groups.to_string())]) 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_active(true);
check_button.set_halign(Align::Center); 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) { fn create_dialog_group_deletion(window_main: &gtk::Window) -> (Dialog, CheckButton) {
let dialog = gtk::Dialog::builder() 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) .transient_for(window_main)
.modal(true) .modal(true)
.build(); .build();
let button_ok = dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok); let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel); 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 label: gtk::Label = gtk::Label::new(Some(&flg!("delete_all_files_in_group_label1")));
let label2: gtk::Label = gtk::Label::new(Some(&fl!("delete_all_files_in_group_label2"))); let label2: gtk::Label = gtk::Label::new(Some(&flg!("delete_all_files_in_group_label2")));
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_active(true);
check_button.set_halign(Align::Center); check_button.set_halign(Align::Center);
@ -364,7 +364,7 @@ pub fn empty_folder_remover(
} }
} }
if error_happened { if error_happened {
messages += &fl!( messages += &flg!(
"delete_folder_failed", "delete_folder_failed",
generate_translation_hashmap(vec![("dir", get_full_name_from_path_name(&path, &name))]) generate_translation_hashmap(vec![("dir", get_full_name_from_path_name(&path, &name))])
); );
@ -421,7 +421,7 @@ pub fn basic_remove(
} }
Err(e) => { Err(e) => {
messages += fl!( messages += flg!(
"delete_file_failed", "delete_file_failed",
generate_translation_hashmap(vec![("name", get_full_name_from_path_name(&path, &name)), ("reason", e.to_string())]) 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); model.remove(&iter);
} }
Err(e) => { Err(e) => {
messages += fl!( messages += flg!(
"delete_file_failed", "delete_file_failed",
generate_translation_hashmap(vec![("name", get_full_name_from_path_name(&path, &name)), ("reason", e.to_string())]) 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 { for file_name in vec_file_name {
if !use_trash { if !use_trash {
if let Err(e) = fs::remove_file(get_full_name_from_path_name(&path, &file_name)) { if let Err(e) = fs::remove_file(get_full_name_from_path_name(&path, &file_name)) {
messages += fl!( messages += flg!(
"delete_file_failed", "delete_file_failed",
generate_translation_hashmap(vec![("name", get_full_name_from_path_name(&path, &file_name)), ("reason", e.to_string())]) 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"; messages += "\n";
} }
} else if let Err(e) = trash::delete(get_full_name_from_path_name(&path, &file_name)) { } else if let Err(e) = trash::delete(get_full_name_from_path_name(&path, &file_name)) {
messages += fl!( messages += flg!(
"delete_file_failed", "delete_file_failed",
generate_translation_hashmap(vec![("name", get_full_name_from_path_name(&path, &file_name)), ("reason", e.to_string())]) 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::prelude::*;
use gtk::{Align, CheckButton, Dialog, ResponseType, TextView, TreeIter, TreePath}; use gtk::{Align, CheckButton, Dialog, ResponseType, TextView, TreeIter, TreePath};
use crate::flg;
use czkawka_core::duplicate::make_hard_link; use czkawka_core::duplicate::make_hard_link;
use czkawka_core::fl;
use crate::gui_structs::gui_data::GuiData; use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*; use crate::help_functions::*;
use crate::localizer::generate_translation_hashmap; use crate::localizer_core::generate_translation_hashmap;
use crate::notebook_enums::*; use crate::notebook_enums::*;
pub fn connect_button_hardlink_symlink(gui_data: &GuiData) { 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 symhardlink_data in vec_symhardlink_data {
for file_to_hardlink in symhardlink_data.files_to_symhardlink { 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)) { 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; continue;
} }
} }
@ -207,7 +207,7 @@ pub fn hardlink_symlink(
if let Err(e) = fs::remove_file(&file_to_symlink) { if let Err(e) = fs::remove_file(&file_to_symlink) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"delete_file_failed", "delete_file_failed",
generate_translation_hashmap(vec![("name", file_to_symlink.to_string()), ("reason", e.to_string())]) 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) { if let Err(e) = std::os::unix::fs::symlink(&symhardlink_data.original_data, &file_to_symlink) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"delete_file_failed", "delete_file_failed",
generate_translation_hashmap(vec![("name", file_to_symlink.to_string()), ("reason", e.to_string())]) 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) { if let Err(e) = std::os::windows::fs::symlink_file(&symhardlink_data.original_data, &file_to_symlink) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"delete_file_failed", "delete_file_failed",
generate_translation_hashmap(vec![("name", file_to_symlink.to_string()), ("reason", e.to_string())]) 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 { fn create_dialog_non_group(window_main: &gtk::Window) -> Dialog {
let dialog = gtk::Dialog::builder() 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) .transient_for(window_main)
.modal(true) .modal(true)
.build(); .build();
let button_ok = dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok); let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel); 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 label: gtk::Label = gtk::Label::new(Some(&flg!("hard_sym_invalid_selection_label_1")));
let label2: gtk::Label = gtk::Label::new(Some(&fl!("hard_sym_invalid_selection_label_2"))); let label2: gtk::Label = gtk::Label::new(Some(&flg!("hard_sym_invalid_selection_label_2")));
let label3: gtk::Label = gtk::Label::new(Some(&fl!("hard_sym_invalid_selection_label_3"))); let label3: gtk::Label = gtk::Label::new(Some(&flg!("hard_sym_invalid_selection_label_3")));
button_ok.grab_focus(); 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) { fn create_dialog_ask_for_linking(window_main: &gtk::Window) -> (Dialog, CheckButton) {
let dialog = gtk::Dialog::builder() let dialog = gtk::Dialog::builder()
.title(&fl!("hard_sym_link_title_dialog")) .title(&flg!("hard_sym_link_title_dialog"))
.transient_for(window_main) .transient_for(window_main)
.modal(true) .modal(true)
.build(); .build();
let button_ok = dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok); let button_ok = dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel); dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let label: gtk::Label = gtk::Label::new(Some(&fl!("hard_sym_link_label"))); let label: gtk::Label = gtk::Label::new(Some(&flg!("hard_sym_link_label")));
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_active(true);
check_button.set_halign(Align::Center); check_button.set_halign(Align::Center);

View file

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

View file

@ -25,7 +25,7 @@ use crate::help_combo_box::{
use crate::help_functions::*; use crate::help_functions::*;
use crate::notebook_enums::*; use crate::notebook_enums::*;
use crate::taskbar_progress::tbp_flags::TBPF_NOPROGRESS; 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)] #[allow(clippy::too_many_arguments)]
pub fn connect_button_search( pub fn connect_button_search(
@ -145,7 +145,7 @@ pub fn connect_button_search(
button_settings.set_sensitive(false); button_settings.set_sensitive(false);
button_app_info.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 // Resets progress bars
progress_bar_all_stages.set_fraction(0 as f64); progress_bar_all_stages.set_fraction(0 as f64);
@ -424,7 +424,7 @@ pub fn connect_button_search(
&buttons_array, &buttons_array,
&buttons_names, &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); show_dialog.store(false, Ordering::Relaxed);
} }
} }

View file

@ -3,7 +3,7 @@ use i18n_embed::unic_langid::LanguageIdentifier;
use i18n_embed::DesktopLanguageRequester; use i18n_embed::DesktopLanguageRequester;
use crate::language_functions::get_language_from_combo_box_text; 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}; // use i18n_embed::{DesktopLanguageRequester, Localizer};
@ -18,7 +18,10 @@ pub fn connect_change_language(gui_data: &GuiData) {
} }
fn 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; 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 czkawka_core::common::Common;
use crate::flg;
use crate::gui_structs::gui_data::GuiData; use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::*; use crate::help_functions::*;
use czkawka_core::fl;
// File length variable allows users to choose duplicates which have shorter file name // 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. // e.g. 'tar.gz' will be selected instead 'tar.gz (copy)' etc.
@ -244,21 +244,21 @@ fn popover_custom_select_unselect(
popover.popdown(); popover.popdown();
let window_title = match select_things { let window_title = match select_things {
false => fl!("popover_custom_mode_unselect"), false => flg!("popover_custom_mode_unselect"),
true => fl!("popover_custom_mode_select"), true => flg!("popover_custom_mode_select"),
}; };
// Dialog for select/unselect items // Dialog for select/unselect items
{ {
let dialog = gtk::Dialog::builder().title(&window_title).transient_for(window_main).modal(true).build(); 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(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel); 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_path = gtk::CheckButton::builder().label(&flg!("popover_custom_regex_path_label")).build();
let check_button_name = gtk::CheckButton::builder().label(&fl!("popover_custom_regex_name_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(&fl!("popover_custom_regex_regex_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); check_button_select_not_all_results.set_active(true);
let entry_path = gtk::Entry::new(); let entry_path = gtk::Entry::new();
@ -270,16 +270,16 @@ fn popover_custom_select_unselect(
// Tooltips // Tooltips
{ {
check_button_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(&fl!("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"))); check_button_name.set_tooltip_text(Some(&flg!("popover_custom_name_check_button_entry_tooltip")));
entry_name.set_tooltip_text(Some(&fl!("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"))); check_button_rust_regex.set_tooltip_text(Some(&flg!("popover_custom_regex_check_button_entry_tooltip")));
entry_rust_regex.set_tooltip_text(Some(&fl!("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(); let label_regex_valid = label_regex_valid.clone();
@ -290,8 +290,8 @@ fn popover_custom_select_unselect(
message = "".to_string(); message = "".to_string();
} else { } else {
match Regex::new(&text_to_check) { match Regex::new(&text_to_check) {
Ok(_) => message = fl!("popover_valid_regex"), Ok(_) => message = flg!("popover_valid_regex"),
Err(_) => message = fl!("popover_invalid_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 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::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 crate::taskbar_progress::tbp_flags::TBPF_INDETERMINATE;
use czkawka_core::fl;
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn connect_progress_window( pub fn connect_progress_window(
@ -43,7 +43,7 @@ pub fn connect_progress_window(
progress_bar_current_stage.hide(); progress_bar_current_stage.hide();
// progress_bar_all_stages.hide(); // progress_bar_all_stages.hide();
progress_bar_all_stages.set_fraction(0 as f64); progress_bar_all_stages.set_fraction(0 as f64);
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_size", "progress_scanning_size",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())]) 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); 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", "progress_analyzed_partial_hash",
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())]) 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); 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", "progress_analyzed_full_hash",
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())]) 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(); label_stage.show();
grid_progress_stages.hide(); grid_progress_stages.hide();
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_name", "progress_scanning_name",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())]) generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
)); ));
@ -110,7 +110,7 @@ pub fn connect_progress_window(
label_stage.show(); label_stage.show();
grid_progress_stages.hide(); grid_progress_stages.hide();
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_size", "progress_scanning_size",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())]) 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 taskbar_state = gui_data.taskbar_state.clone();
let future = async move { let future = async move {
while let Some(item) = futures_receiver_empty_files.next().await { while let Some(item) = futures_receiver_empty_files.next().await {
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_general_file", "progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())]) 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 taskbar_state = gui_data.taskbar_state.clone();
let future = async move { let future = async move {
while let Some(item) = futures_receiver_empty_folder.next().await { while let Some(item) = futures_receiver_empty_folder.next().await {
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_empty_folders", "progress_scanning_empty_folders",
generate_translation_hashmap(vec![("folder_number", item.entries_checked.to_string())]) 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 taskbar_state = gui_data.taskbar_state.clone();
let future = async move { let future = async move {
while let Some(item) = futures_receiver_big_files.next().await { while let Some(item) = futures_receiver_big_files.next().await {
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_general_file", "progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.files_checked.to_string())]) generate_translation_hashmap(vec![("file_number", item.files_checked.to_string())])
)); ));
@ -180,7 +180,7 @@ pub fn connect_progress_window(
match item.current_stage { match item.current_stage {
0 => { 0 => {
progress_bar_current_stage.hide(); progress_bar_current_stage.hide();
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_general_file", "progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())]) 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); progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(1, (item.max_stage + 1) as u64); 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", "progress_scanning_music_tags",
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())]) 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); progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(2, (item.max_stage + 1) as u64); 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", "progress_scanning_music_tags_end",
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())]) 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 { match item.current_stage {
0 => { 0 => {
progress_bar_current_stage.hide(); progress_bar_current_stage.hide();
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_general_file", "progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.images_checked.to_string())]) 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); progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(1, (item.max_stage + 1) as u64); 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", "progress_scanning_image",
generate_translation_hashmap(vec![("file_checked", item.images_checked.to_string()), ("all_files", item.images_to_check.to_string())]) 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); progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(2, (item.max_stage + 1) as u64); 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", "progress_comparing_image_hashes",
generate_translation_hashmap(vec![("file_checked", item.images_checked.to_string()), ("all_files", item.images_to_check.to_string())]) 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 { match item.current_stage {
0 => { 0 => {
progress_bar_current_stage.hide(); progress_bar_current_stage.hide();
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_general_file", "progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.videos_checked.to_string())]) 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); progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(1, (item.max_stage + 1) as u64); 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", "progress_scanning_video",
generate_translation_hashmap(vec![("file_checked", item.videos_checked.to_string()), ("all_files", item.videos_to_check.to_string())]) 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 taskbar_state = gui_data.taskbar_state.clone();
let future = async move { let future = async move {
while let Some(item) = futures_receiver_temporary.next().await { while let Some(item) = futures_receiver_temporary.next().await {
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_general_file", "progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.files_checked.to_string())]) 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 taskbar_state = gui_data.taskbar_state.clone();
let future = async move { let future = async move {
while let Some(item) = futures_receiver_invalid_symlinks.next().await { while let Some(item) = futures_receiver_invalid_symlinks.next().await {
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_general_file", "progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())]) generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
)); ));
@ -379,7 +379,7 @@ pub fn connect_progress_window(
match item.current_stage { match item.current_stage {
0 => { 0 => {
progress_bar_current_stage.hide(); progress_bar_current_stage.hide();
label_stage.set_text(&fl!( label_stage.set_text(&flg!(
"progress_scanning_general_file", "progress_scanning_general_file",
generate_translation_hashmap(vec![("file_number", item.files_checked.to_string())]) 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); progress_bar_current_stage.set_fraction(0f64);
taskbar_state.borrow().set_progress_value(1, (item.max_stage + 1) as u64); 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", "progress_scanning_broken_files",
generate_translation_hashmap(vec![("file_checked", item.files_checked.to_string()), ("all_files", item.files_to_check.to_string())]) 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::prelude::*;
use gtk::{ResponseType, TreeView, Window}; use gtk::{ResponseType, TreeView, Window};
use crate::flg;
#[cfg(target_family = "windows")] #[cfg(target_family = "windows")]
use czkawka_core::common::Common; use czkawka_core::common::Common;
use czkawka_core::fl;
use crate::gui_structs::gui_data::GuiData; use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::{get_dialog_box_child, get_list_store, ColumnsExcludedDirectory, ColumnsIncludedDirectory}; 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) { fn add_chosen_directories(window_main: &Window, tree_view: &TreeView, excluded_items: bool) {
let folders_to = if excluded_items { let folders_to = if excluded_items {
fl!("exclude_folders_dialog_title") flg!("exclude_folders_dialog_title")
} else { } else {
fl!("include_folders_dialog_title") flg!("include_folders_dialog_title")
}; };
let file_chooser = gtk::FileChooserDialog::builder() 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) .transient_for(window_main)
.modal(true) .modal(true)
.build(); .build();
file_chooser.add_button(&fl!("general_ok_button"), ResponseType::Ok); file_chooser.add_button(&flg!("general_ok_button"), ResponseType::Ok);
file_chooser.add_button(&fl!("general_close_button"), ResponseType::Cancel); file_chooser.add_button(&flg!("general_close_button"), ResponseType::Cancel);
file_chooser.set_select_multiple(true); file_chooser.set_select_multiple(true);
file_chooser.show_all(); 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) { fn add_manually_directories(window_main: &Window, tree_view: &TreeView, excluded_items: bool) {
let dialog = gtk::Dialog::builder() let dialog = gtk::Dialog::builder()
.title(&fl!("include_manually_directories_dialog_title")) .title(&flg!("include_manually_directories_dialog_title"))
.transient_for(window_main) .transient_for(window_main)
.modal(true) .modal(true)
.build(); .build();
dialog.add_button(&fl!("general_ok_button"), ResponseType::Ok); dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel); dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let entry: gtk::Entry = gtk::Entry::new(); let entry: gtk::Entry = gtk::Entry::new();

View file

@ -7,9 +7,9 @@ use gtk::{LabelBuilder, ResponseType, Window};
use image::imageops::FilterType; use image::imageops::FilterType;
use img_hash::HashAlg; use img_hash::HashAlg;
use crate::flg;
use czkawka_core::common_messages::Messages; use czkawka_core::common_messages::Messages;
use czkawka_core::duplicate::HashType; use czkawka_core::duplicate::HashType;
use czkawka_core::fl;
use crate::gui_structs::gui_data::GuiData; use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::get_dialog_box_child; 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(); 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 |_| { 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(); dialog.show_all();
let text_view_errors = text_view_errors.clone(); 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()); 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(); let text_view_errors = gui_data.text_view_errors.clone();
button_settings_similar_images_clear_cache.connect_clicked(move |_| { 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(); dialog.show_all();
let text_view_errors = text_view_errors.clone(); 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()); text_view_errors.buffer().unwrap().set_text(messages.create_messages_text().as_str());
} }
dialog.close(); dialog.close();
@ -176,7 +176,7 @@ pub fn connect_settings(gui_data: &GuiData) {
let text_view_errors = gui_data.text_view_errors.clone(); let text_view_errors = gui_data.text_view_errors.clone();
button_settings_similar_videos_clear_cache.connect_clicked(move |_| { 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(); dialog.show_all();
let text_view_errors = text_view_errors.clone(); 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); 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()); text_view_errors.buffer().unwrap().set_text(messages.create_messages_text().as_str());
} }
dialog.close(); 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 { 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(); 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(&flg!("general_ok_button"), ResponseType::Ok);
dialog.add_button(&fl!("general_close_button"), ResponseType::Cancel); dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
let label = LabelBuilder::new().label(&fl!("cache_clear_message_label_1")).build(); let label = LabelBuilder::new().label(&flg!("cache_clear_message_label_1")).build();
let label2 = LabelBuilder::new().label(&fl!("cache_clear_message_label_2")).build(); let label2 = LabelBuilder::new().label(&flg!("cache_clear_message_label_2")).build();
let label3 = LabelBuilder::new().label(&fl!("cache_clear_message_label_3")).build(); let label3 = LabelBuilder::new().label(&flg!("cache_clear_message_label_3")).build();
let label4 = LabelBuilder::new().label(&fl!("cache_clear_message_label_4")).build(); let label4 = LabelBuilder::new().label(&flg!("cache_clear_message_label_4")).build();
let internal_box = get_dialog_box_child(&dialog); let internal_box = get_dialog_box_child(&dialog);
internal_box.add(&label); internal_box.add(&label);

View file

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

View file

@ -1,8 +1,8 @@
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{Bin, Widget}; use gtk::{Bin, Widget};
use crate::flg;
use crate::help_functions::{get_custom_label_from_button_with_image, BottomButtonsEnum}; use crate::help_functions::{get_custom_label_from_button_with_image, BottomButtonsEnum};
use czkawka_core::fl;
#[derive(Clone)] #[derive(Clone)]
pub struct GuiBottomButtons { pub struct GuiBottomButtons {
@ -73,31 +73,31 @@ impl GuiBottomButtons {
} }
} }
pub fn update_language(&self) { 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_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(&fl!("bottom_select_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(&fl!("bottom_delete_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(&fl!("bottom_save_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(&fl!("bottom_symlink_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(&fl!("bottom_hardlink_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(&fl!("bottom_move_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_search.clone()).set_text(&flg!("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_select.clone()).set_text(&flg!("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_delete.clone()).set_text(&flg!("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_save.clone()).set_text(&flg!("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_symlink.clone()).set_text(&flg!("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_hardlink.clone()).set_text(&flg!("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_move.clone()).set_text(&flg!("bottom_move_button"));
self.buttons_search.set_tooltip_text(Some(&fl!("bottom_search_button_tooltip"))); self.buttons_search.set_tooltip_text(Some(&flg!("bottom_search_button_tooltip")));
self.buttons_select.set_tooltip_text(Some(&fl!("bottom_select_button_tooltip"))); self.buttons_select.set_tooltip_text(Some(&flg!("bottom_select_button_tooltip")));
self.buttons_delete.set_tooltip_text(Some(&fl!("bottom_delete_button_tooltip"))); self.buttons_delete.set_tooltip_text(Some(&flg!("bottom_delete_button_tooltip")));
self.buttons_save.set_tooltip_text(Some(&fl!("bottom_save_button_tooltip"))); self.buttons_save.set_tooltip_text(Some(&flg!("bottom_save_button_tooltip")));
self.buttons_symlink.set_tooltip_text(Some(&fl!("bottom_symlink_button_tooltip"))); self.buttons_symlink.set_tooltip_text(Some(&flg!("bottom_symlink_button_tooltip")));
self.buttons_hardlink.set_tooltip_text(Some(&fl!("bottom_hardlink_button_tooltip"))); self.buttons_hardlink.set_tooltip_text(Some(&flg!("bottom_hardlink_button_tooltip")));
self.buttons_move.set_tooltip_text(Some(&fl!("bottom_move_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_errors.set_tooltip_text(Some(&flg!("bottom_show_errors_tooltip")));
self.buttons_show_upper_notebook.set_tooltip_text(Some(&fl!("bottom_show_upper_notebook_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::prelude::*;
use gtk::{Builder, TreePath}; use gtk::{Builder, TreePath};
use std::cell::RefCell; use std::cell::RefCell;
@ -34,7 +34,7 @@ impl GuiCompareImages {
let builder = Builder::from_string(glade_src.as_str()); let builder = Builder::from_string(glade_src.as_str());
let window_compare: gtk::Window = builder.object("window_compare").unwrap(); 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_modal(true);
window_compare.set_transient_for(Some(window_main)); window_compare.set_transient_for(Some(window_main));
@ -75,6 +75,6 @@ impl GuiCompareImages {
} }
} }
pub fn update_language(&self) { 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::prelude::*;
use gtk::Builder; use gtk::Builder;
use crate::flg;
use czkawka_core::big_file::BigFile; use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::BrokenFiles; use czkawka_core::broken_files::BrokenFiles;
use czkawka_core::duplicate::DuplicateFinder; use czkawka_core::duplicate::DuplicateFinder;
use czkawka_core::empty_files::EmptyFiles; use czkawka_core::empty_files::EmptyFiles;
use czkawka_core::empty_folder::EmptyFolder; use czkawka_core::empty_folder::EmptyFolder;
use czkawka_core::fl;
use czkawka_core::invalid_symlinks::InvalidSymlinks; use czkawka_core::invalid_symlinks::InvalidSymlinks;
use czkawka_core::same_music::SameMusic; use czkawka_core::same_music::SameMusic;
use czkawka_core::similar_images::SimilarImages; use czkawka_core::similar_images::SimilarImages;
@ -93,7 +93,7 @@ impl GuiData {
//// Windows //// Windows
let window_main: gtk::Window = builder.object("window_main").unwrap(); 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(); window_main.show_all();
let pixbuf = Pixbuf::from_read(std::io::BufReader::new(&ICON_ABOUT[..])).unwrap(); let pixbuf = Pixbuf::from_read(std::io::BufReader::new(&ICON_ABOUT[..])).unwrap();
@ -193,7 +193,7 @@ impl GuiData {
} }
pub fn update_language(&self) { 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.main_notebook.update_language();
self.upper_notebook.update_language(); self.upper_notebook.update_language();

View file

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

View file

@ -1,7 +1,7 @@
use gtk::prelude::*; use gtk::prelude::*;
use gtk::Builder; use gtk::Builder;
use czkawka_core::fl; use crate::flg;
#[derive(Clone)] #[derive(Clone)]
pub struct GuiPopovers { pub struct GuiPopovers {
@ -85,18 +85,18 @@ impl GuiPopovers {
} }
} }
pub fn update_language(&self) { pub fn update_language(&self) {
self.buttons_popover_select_all.set_label(&fl!("popover_select_all")); self.buttons_popover_select_all.set_label(&flg!("popover_select_all"));
self.buttons_popover_unselect_all.set_label(&fl!("popover_unselect_all")); self.buttons_popover_unselect_all.set_label(&flg!("popover_unselect_all"));
self.buttons_popover_reverse.set_label(&fl!("popover_reverse")); self.buttons_popover_reverse.set_label(&flg!("popover_reverse"));
self.buttons_popover_select_all_except_oldest.set_label(&fl!("popover_select_all_except_oldest")); self.buttons_popover_select_all_except_oldest.set_label(&flg!("popover_select_all_except_oldest"));
self.buttons_popover_select_all_except_newest.set_label(&fl!("popover_select_all_except_newest")); self.buttons_popover_select_all_except_newest.set_label(&flg!("popover_select_all_except_newest"));
self.buttons_popover_select_one_oldest.set_label(&fl!("popover_select_one_oldest")); self.buttons_popover_select_one_oldest.set_label(&flg!("popover_select_one_oldest"));
self.buttons_popover_select_one_newest.set_label(&fl!("popover_select_one_newest")); self.buttons_popover_select_one_newest.set_label(&flg!("popover_select_one_newest"));
self.buttons_popover_select_custom.set_label(&fl!("popover_select_custom")); self.buttons_popover_select_custom.set_label(&flg!("popover_select_custom"));
self.buttons_popover_unselect_custom.set_label(&fl!("popover_unselect_custom")); self.buttons_popover_unselect_custom.set_label(&flg!("popover_unselect_custom"));
self.buttons_popover_select_all_images_except_biggest 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 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::prelude::*;
use gtk::{Bin, Builder, EventControllerKey, Window}; use gtk::{Bin, Builder, EventControllerKey, Window};
use crate::flg;
use crate::help_functions::get_custom_label_from_button_with_image; use crate::help_functions::get_custom_label_from_button_with_image;
use czkawka_core::fl;
#[derive(Clone)] #[derive(Clone)]
pub struct GuiProgressDialog { pub struct GuiProgressDialog {
@ -28,7 +28,7 @@ impl GuiProgressDialog {
let builder = Builder::from_string(glade_src.as_str()); let builder = Builder::from_string(glade_src.as_str());
let window_progress: gtk::Dialog = builder.object("window_progress").unwrap(); 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_transient_for(Some(window_main));
window_progress.set_modal(true); window_progress.set_modal(true);
@ -61,11 +61,11 @@ impl GuiProgressDialog {
} }
} }
pub fn update_language(&self) { 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_current_stage.set_label(&flg!("progress_current_stage"));
self.label_progress_all_stages.set_label(&fl!("progress_all_stages")); self.label_progress_all_stages.set_label(&flg!("progress_all_stages"));
} }
} }

View file

@ -1,7 +1,7 @@
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{Builder, Window}; use gtk::{Builder, Window};
use czkawka_core::fl; use crate::flg;
#[derive(Clone)] #[derive(Clone)]
pub struct GuiSettings { pub struct GuiSettings {
@ -57,7 +57,7 @@ impl GuiSettings {
let builder = Builder::from_string(glade_src.as_str()); let builder = Builder::from_string(glade_src.as_str());
let window_settings: gtk::Window = builder.object("window_settings").unwrap(); 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_modal(true);
window_settings.set_transient_for(Some(window_main)); window_settings.set_transient_for(Some(window_main));
@ -141,98 +141,100 @@ impl GuiSettings {
} }
pub fn update_language(&self) { 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_save_at_exit.set_label(&flg!("settings_save_at_exit_button"));
self.check_button_settings_load_at_start.set_label(&fl!("settings_load_at_start_button")); self.check_button_settings_load_at_start.set_label(&flg!("settings_load_at_start_button"));
self.check_button_settings_confirm_deletion.set_label(&fl!("settings_confirm_deletion_button")); self.check_button_settings_confirm_deletion.set_label(&flg!("settings_confirm_deletion_button"));
self.check_button_settings_confirm_link.set_label(&fl!("settings_confirm_link_button")); self.check_button_settings_confirm_link.set_label(&flg!("settings_confirm_link_button"));
self.check_button_settings_confirm_group_deletion.set_label(&fl!("settings_confirm_group_deletion_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(&fl!("settings_show_text_view_button")); self.check_button_settings_show_text_view.set_label(&flg!("settings_show_text_view_button"));
self.check_button_settings_use_cache.set_label(&fl!("settings_use_cache_button")); self.check_button_settings_use_cache.set_label(&flg!("settings_use_cache_button"));
self.check_button_settings_save_also_json.set_label(&fl!("settings_save_also_as_json_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(&fl!("settings_use_trash_button")); self.check_button_settings_use_trash.set_label(&flg!("settings_use_trash_button"));
self.label_settings_general_language.set_label(&fl!("settings_language_label")); 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 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 self.check_button_settings_confirm_deletion
.set_tooltip_text(Some(&fl!("settings_confirm_deletion_button_tooltip"))); .set_tooltip_text(Some(&flg!("settings_confirm_deletion_button_tooltip")));
self.check_button_settings_confirm_link.set_tooltip_text(Some(&fl!("settings_confirm_link_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 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 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 self.check_button_settings_save_also_json
.set_tooltip_text(Some(&fl!("settings_save_also_as_json_button_tooltip"))); .set_tooltip_text(Some(&flg!("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_cache.set_tooltip_text(Some(&flg!("settings_use_cache_button_tooltip")));
self.check_button_settings_use_trash.set_tooltip_text(Some(&fl!("settings_use_trash_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(&fl!("settings_language_label_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 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 self.check_button_settings_duplicates_delete_outdated_cache
.set_label(&fl!("settings_multiple_delete_outdated_cache_checkbutton")); .set_label(&flg!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_duplicates_clear_cache.set_label(&fl!("settings_multiple_clear_cache_button")); self.button_settings_duplicates_clear_cache.set_label(&flg!("settings_multiple_clear_cache_button"));
self.check_button_duplicates_use_prehash_cache.set_label(&fl!("settings_duplicates_prehash_checkbutton")); self.check_button_duplicates_use_prehash_cache.set_label(&flg!("settings_duplicates_prehash_checkbutton"));
self.label_settings_duplicate_minimal_size_cache 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 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 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 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 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 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 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 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 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 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 self.check_button_settings_similar_images_delete_outdated_cache
.set_label(&fl!("settings_multiple_delete_outdated_cache_checkbutton")); .set_label(&flg!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_similar_images_clear_cache.set_label(&fl!("settings_multiple_clear_cache_button")); self.button_settings_similar_images_clear_cache.set_label(&flg!("settings_multiple_clear_cache_button"));
self.check_button_settings_show_preview_similar_images 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 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 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 self.check_button_settings_similar_videos_delete_outdated_cache
.set_label(&fl!("settings_multiple_delete_outdated_cache_checkbutton")); .set_label(&flg!("settings_multiple_delete_outdated_cache_checkbutton"));
self.button_settings_similar_videos_clear_cache.set_label(&fl!("settings_multiple_clear_cache_button")); self.button_settings_similar_videos_clear_cache.set_label(&flg!("settings_multiple_clear_cache_button"));
self.check_button_settings_similar_videos_delete_outdated_cache 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 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_save_configuration.set_label(&flg!("settings_saving_button"));
self.button_settings_load_configuration.set_label(&fl!("settings_loading_button")); self.button_settings_load_configuration.set_label(&flg!("settings_loading_button"));
self.button_settings_reset_configuration.set_label(&fl!("settings_reset_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_save_configuration.set_tooltip_text(Some(&flg!("settings_saving_button_tooltip")));
self.button_settings_load_configuration.set_tooltip_text(Some(&fl!("settings_loading_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(&fl!("settings_reset_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_cache_folder.set_label(&flg!("settings_folder_cache_open"));
self.button_settings_open_settings_folder.set_label(&fl!("settings_folder_settings_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 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(); let vec_children: Vec<gtk::Widget> = self.notebook_settings.children();
@ -241,10 +243,10 @@ impl GuiSettings {
// Change name of main notebook tabs // Change name of main notebook tabs
let names: [String; 4] = [ let names: [String; 4] = [
fl!("settings_notebook_general"), flg!("settings_notebook_general"),
fl!("settings_notebook_duplicates"), flg!("settings_notebook_duplicates"),
fl!("settings_notebook_images"), flg!("settings_notebook_images"),
fl!("settings_notebook_videos"), flg!("settings_notebook_videos"),
]; ];
for (index, fl_thing) in names.iter().enumerate() { for (index, fl_thing) in names.iter().enumerate() {
self.notebook_settings self.notebook_settings

View file

@ -1,9 +1,9 @@
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{Bin, EventControllerKey, TreeView}; use gtk::{Bin, EventControllerKey, TreeView};
use crate::flg;
use crate::help_functions::get_custom_label_from_button_with_image; use crate::help_functions::get_custom_label_from_button_with_image;
use crate::notebook_enums::NotebookUpperEnum; use crate::notebook_enums::NotebookUpperEnum;
use czkawka_core::fl;
#[derive(Clone)] #[derive(Clone)]
pub struct GuiUpperNotebook { pub struct GuiUpperNotebook {
@ -101,50 +101,50 @@ impl GuiUpperNotebook {
} }
} }
pub fn update_language(&self) { pub fn update_language(&self) {
self.check_button_recursive.set_label(&fl!("upper_recursive_button")); self.check_button_recursive.set_label(&flg!("upper_recursive_button"));
self.check_button_recursive.set_tooltip_text(Some(&fl!("upper_recursive_button_tooltip"))); 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_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(&fl!("upper_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(&fl!("upper_remove_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(&fl!("upper_manual_add_excluded_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(&fl!("upper_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(&fl!("upper_remove_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 // 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_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(&fl!("upper_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(&fl!("upper_remove_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(&fl!("upper_manual_add_excluded_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(&fl!("upper_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(&fl!("upper_remove_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 self.buttons_manual_add_included_directory
.set_tooltip_text(Some(&fl!("upper_manual_add_included_button_tooltip"))); .set_tooltip_text(Some(&flg!("upper_manual_add_included_button_tooltip")));
self.buttons_add_included_directory.set_tooltip_text(Some(&fl!("upper_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(&fl!("upper_remove_included_button_tooltip"))); self.buttons_remove_included_directory.set_tooltip_text(Some(&flg!("upper_remove_included_button_tooltip")));
self.buttons_manual_add_excluded_directory self.buttons_manual_add_excluded_directory
.set_tooltip_text(Some(&fl!("upper_manual_add_excluded_button_tooltip"))); .set_tooltip_text(Some(&flg!("upper_manual_add_excluded_button_tooltip")));
self.buttons_add_excluded_directory.set_tooltip_text(Some(&fl!("upper_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(&fl!("upper_remove_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.label_allowed_extensions.set_tooltip_text(Some(&flg!("upper_allowed_extensions_tooltip")));
self.entry_allowed_extensions.set_tooltip_text(Some(&fl!("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(&fl!("upper_excluded_items_tooltip"))); self.label_excluded_items.set_tooltip_text(Some(&flg!("upper_excluded_items_tooltip")));
self.entry_excluded_items.set_tooltip_text(Some(&fl!("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_excluded_items.set_label(&flg!("upper_excluded_items"));
self.label_allowed_extensions.set_label(&fl!("upper_allowed_extensions")); 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_size_bytes.set_label(&flg!("main_label_size_bytes"));
self.label_general_min_size.set_label(&fl!("main_label_min_size")); self.label_general_min_size.set_label(&flg!("main_label_min_size"));
self.label_general_max_size.set_label(&fl!("main_label_max_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_size_bytes.set_tooltip_text(Some(&flg!("main_label_size_bytes_tooltip")));
self.label_general_min_size.set_tooltip_text(Some(&fl!("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(&fl!("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(&fl!("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(&fl!("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(); let vec_children: Vec<gtk::Widget> = self.notebook_upper.children();
@ -153,9 +153,9 @@ impl GuiUpperNotebook {
// Change name of upper notebook tabs // Change name of upper notebook tabs
for (upper_enum, fl_thing) in [ for (upper_enum, fl_thing) in [
(NotebookUpperEnum::ItemsConfiguration as usize, fl!("upper_notebook_items_configuration")), (NotebookUpperEnum::ItemsConfiguration as usize, flg!("upper_notebook_items_configuration")),
(NotebookUpperEnum::ExcludedDirectories as usize, fl!("upper_notebook_excluded_directories")), (NotebookUpperEnum::ExcludedDirectories as usize, flg!("upper_notebook_excluded_directories")),
(NotebookUpperEnum::IncludedDirectories as usize, fl!("upper_notebook_included_directories")), (NotebookUpperEnum::IncludedDirectories as usize, flg!("upper_notebook_included_directories")),
] { ] {
self.notebook_upper self.notebook_upper
.tab_label(&vec_children[upper_enum]) .tab_label(&vec_children[upper_enum])
@ -166,7 +166,10 @@ impl GuiUpperNotebook {
} }
let names_of_columns = [ 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() { 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::DynamicImage;
use image::GenericImageView; use image::GenericImageView;
use crate::flg;
use czkawka_core::big_file::BigFile; use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::BrokenFiles; use czkawka_core::broken_files::BrokenFiles;
use czkawka_core::common_dir_traversal;
use czkawka_core::common_messages::Messages; use czkawka_core::common_messages::Messages;
use czkawka_core::duplicate::DuplicateFinder; use czkawka_core::duplicate::DuplicateFinder;
use czkawka_core::empty_files::EmptyFiles; 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_images::SimilarImages;
use czkawka_core::similar_videos::SimilarVideos; use czkawka_core::similar_videos::SimilarVideos;
use czkawka_core::temporary::Temporary; use czkawka_core::temporary::Temporary;
use czkawka_core::{common_dir_traversal, fl};
use crate::notebook_enums::{NotebookMainEnum, NotebookUpperEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS}; 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) { pub fn print_text_messages_to_text_view(text_messages: &Messages, text_view: &gtk::TextView) {
let mut messages: String = String::from(""); let mut messages: String = String::from("");
if !text_messages.messages.is_empty() { 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 { for text in &text_messages.messages {
messages += text.as_str(); messages += text.as_str();
@ -405,7 +406,7 @@ pub fn print_text_messages_to_text_view(text_messages: &Messages, text_view: &gt
// messages += "\n"; // messages += "\n";
// } // }
if !text_messages.warnings.is_empty() { 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 { for text in &text_messages.warnings {
messages += text.as_str(); messages += text.as_str();
@ -415,7 +416,7 @@ pub fn print_text_messages_to_text_view(text_messages: &Messages, text_view: &gt
// messages += "\n"; // messages += "\n";
// } // }
if !text_messages.errors.is_empty() { 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 { for text in &text_messages.errors {
messages += text.as_str(); 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 { pub fn get_text_from_invalid_symlink_cause(error: &common_dir_traversal::ErrorType) -> String {
match error { match error {
common_dir_traversal::ErrorType::InfiniteRecursion => fl!("invalid_symlink_infinite_recursion"), common_dir_traversal::ErrorType::InfiniteRecursion => flg!("invalid_symlink_infinite_recursion"),
common_dir_traversal::ErrorType::NonExistentFile => fl!("invalid_symlink_non_existent_destination"), 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::imageops::FilterType;
use image::GenericImageView; 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_images::{IMAGE_RS_EXTENSIONS, RAW_IMAGE_EXTENSIONS, SIMILAR_VALUES};
use czkawka_core::similar_videos::MAX_TOLERANCE; use czkawka_core::similar_videos::MAX_TOLERANCE;
@ -23,7 +23,7 @@ use crate::help_combo_box::{
}; };
use crate::help_functions::*; use crate::help_functions::*;
use crate::language_functions::LANGUAGES_ALL; 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::notebook_enums::NotebookMainEnum;
use crate::opening_selecting_records::*; use crate::opening_selecting_records::*;
@ -697,7 +697,7 @@ fn show_preview(
} else if let Err(e) = fs::create_dir_all(cache_dir) { } else if let Err(e) = fs::create_dir_all(cache_dir) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"preview_failed_to_create_cache_dir", "preview_failed_to_create_cache_dir",
generate_translation_hashmap(vec![("name", cache_dir.display().to_string()), ("reason", e.to_string())]) generate_translation_hashmap(vec![("name", cache_dir.display().to_string()), ("reason", e.to_string())])
) )
@ -733,7 +733,7 @@ fn show_preview(
Err(e) => { Err(e) => {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"preview_temporary_file", "preview_temporary_file",
generate_translation_hashmap(vec![("name", file_name.to_string()), ("reason", e.to_string())]) generate_translation_hashmap(vec![("name", file_name.to_string()), ("reason", e.to_string())])
) )
@ -748,7 +748,7 @@ fn show_preview(
None => { None => {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"preview_temporary_file", "preview_temporary_file",
generate_translation_hashmap(vec![("name", file_name.to_string()), ("reason", "None".to_string())]) 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 { if img.width() == 0 || img.height() == 0 {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, 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; break 'dir;
} }
@ -773,7 +773,7 @@ fn show_preview(
if let Err(e) = img.save(&file_dir) { if let Err(e) = img.save(&file_dir) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"preview_temporary_image_save", "preview_temporary_image_save",
generate_translation_hashmap(vec![("name", file_dir.display().to_string()), ("reason", e.to_string())]) 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) { if let Err(e) = fs::remove_file(&file_dir) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"preview_temporary_image_remove", "preview_temporary_image_remove",
generate_translation_hashmap(vec![("name", file_dir.display().to_string()), ("reason", e.to_string())]) 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 help_functions;
mod initialize_gui; mod initialize_gui;
mod language_functions; mod language_functions;
mod localizer_gui;
mod notebook_enums; mod notebook_enums;
mod opening_selecting_records; mod opening_selecting_records;
mod saving_loading; mod saving_loading;

View file

@ -8,15 +8,15 @@ use directories_next::ProjectDirs;
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{ComboBoxText, ScrolledWindow, TextView}; use gtk::{ComboBoxText, ScrolledWindow, TextView};
use crate::flg;
use crate::gui_structs::gui_main_notebook::GuiMainNotebook; use crate::gui_structs::gui_main_notebook::GuiMainNotebook;
use czkawka_core::fl;
use czkawka_core::similar_images::SIMILAR_VALUES; use czkawka_core::similar_images::SIMILAR_VALUES;
use crate::gui_structs::gui_settings::GuiSettings; use crate::gui_structs::gui_settings::GuiSettings;
use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook; use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook;
use crate::help_functions::*; use crate::help_functions::*;
use crate::language_functions::{get_language_from_combo_box_text, LANGUAGES_ALL}; 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 // 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"; const SAVE_FILE_NAME: &str = "czkawka_gui_config_4.txt";
@ -107,7 +107,7 @@ impl LoadSaveStruct {
} else { } else {
add_text_to_text_view( add_text_to_text_view(
&self.text_view, &self.text_view,
&fl!( &flg!(
"saving_loading_invalid_string", "saving_loading_invalid_string",
generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))]) generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))])
), ),
@ -133,7 +133,7 @@ impl LoadSaveStruct {
} else { } else {
add_text_to_text_view( add_text_to_text_view(
&self.text_view, &self.text_view,
&fl!( &flg!(
"saving_loading_invalid_int", "saving_loading_invalid_int",
generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))]) generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))])
), ),
@ -156,7 +156,7 @@ impl LoadSaveStruct {
} else { } else {
add_text_to_text_view( add_text_to_text_view(
&self.text_view, &self.text_view,
&fl!( &flg!(
"saving_loading_decode_problem_bool", "saving_loading_decode_problem_bool",
generate_translation_hashmap(vec![("key", key), ("result", item[0].to_string())]) generate_translation_hashmap(vec![("key", key), ("result", item[0].to_string())])
), ),
@ -166,7 +166,7 @@ impl LoadSaveStruct {
} else { } else {
add_text_to_text_view( add_text_to_text_view(
&self.text_view, &self.text_view,
&fl!( &flg!(
"saving_loading_invalid_bool", "saving_loading_invalid_bool",
generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))]) generate_translation_hashmap(vec![("key", key), ("result", format!("{:?}", item))])
), ),
@ -183,7 +183,7 @@ impl LoadSaveStruct {
if self.loaded_items.contains_key(&key) { if self.loaded_items.contains_key(&key) {
add_text_to_text_view( add_text_to_text_view(
&self.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() { if !config_dir.is_dir() {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
&fl!( &flg!(
"saving_loading_folder_config_instead_file", "saving_loading_folder_config_instead_file",
generate_translation_hashmap(vec![("path", config_dir.display().to_string())]) 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) { } else if let Err(e) = fs::create_dir_all(config_dir) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
&fl!( &flg!(
"saving_loading_failed_to_create_configuration_folder", "saving_loading_failed_to_create_configuration_folder",
generate_translation_hashmap(vec![("path", config_dir.display().to_string()), ("reason", e.to_string())]) generate_translation_hashmap(vec![("path", config_dir.display().to_string()), ("reason", e.to_string())])
), ),
@ -242,7 +242,7 @@ impl LoadSaveStruct {
Err(e) => { Err(e) => {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
&fl!( &flg!(
"saving_loading_failed_to_create_config_file", "saving_loading_failed_to_create_config_file",
generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())]) 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 // Don't show errors when there is no configuration file when starting app
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
&fl!( &flg!(
"saving_loading_failed_to_read_config_file", "saving_loading_failed_to_read_config_file",
generate_translation_hashmap(vec![("path", config_file.display().to_string())]) generate_translation_hashmap(vec![("path", config_file.display().to_string())])
), ),
@ -271,7 +271,7 @@ impl LoadSaveStruct {
Err(e) => { Err(e) => {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
&fl!( &flg!(
"saving_loading_failed_to_create_config_file", "saving_loading_failed_to_create_config_file",
generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())]) 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)); return Some((config_file_handler, config_file));
} }
} else { } 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 None
} }
@ -293,7 +293,7 @@ impl LoadSaveStruct {
if let Err(e) = config_file_handler.read_to_string(&mut loaded_data) { if let Err(e) = config_file_handler.read_to_string(&mut loaded_data) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
&fl!( &flg!(
"saving_loading_failed_to_read_data_from_file", "saving_loading_failed_to_read_data_from_file",
generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())]) generate_translation_hashmap(vec![("path", config_file.display().to_string()), ("reason", e.to_string())])
), ),
@ -313,7 +313,7 @@ impl LoadSaveStruct {
} else { } else {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
&fl!( &flg!(
"saving_loading_orphan_data", "saving_loading_orphan_data",
generate_translation_hashmap(vec![("data", line.to_string()), ("index", index.to_string())]) generate_translation_hashmap(vec![("data", line.to_string()), ("index", index.to_string())])
), ),
@ -326,13 +326,13 @@ impl LoadSaveStruct {
if !hashmap_sl.contains_key(setting) { if !hashmap_sl.contains_key(setting) {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, 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 { 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 { if data_saved {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"saving_loading_saving_success", "saving_loading_saving_success",
generate_translation_hashmap(vec![("name", config_file.display().to_string())]) generate_translation_hashmap(vec![("name", config_file.display().to_string())])
) )
@ -374,7 +374,7 @@ impl LoadSaveStruct {
} else { } else {
add_text_to_text_view( add_text_to_text_view(
text_view_errors, text_view_errors,
fl!( flg!(
"saving_loading_saving_failure", "saving_loading_saving_failure",
generate_translation_hashmap(vec![("name", config_file.display().to_string())]) 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); main_notebook.scale_similarity_similar_videos.set_value(DEFAULT_SIMILAR_VIDEOS_SIMILARITY as f64);
} }
if manual_clearing { 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="window-position">center</property>
<property name="type-hint">dialog</property> <property name="type-hint">dialog</property>
<property name="program-name">Czkawka</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) <property name="comments" translatable="yes">2020 - 2022 Rafał Mikrut(qarmin)
This program is free to use and will always be. 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="can-focus">True</property>
<property name="editable">False</property> <property name="editable">False</property>
<property name="has-frame">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="xalign">1</property>
<property name="shadow-type">none</property> <property name="shadow-type">none</property>
<property name="caps-lock-warning">False</property> <property name="caps-lock-warning">False</property>

View file

@ -19,7 +19,7 @@
</screenshot> </screenshot>
</screenshots> </screenshots>
<releases> <releases>
<release version="3.3.1" date="2021-11-22"/> <release version="4.0.0" date="2021-01-20"/>
</releases> </releases>
<content_rating type="oars-1.0"/> <content_rating type="oars-1.0"/>
<developer_name>Rafał Mikrut</developer_name> <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 #!/bin/bash
NUMBER="3.3.1" NUMBER="4.0.0"
CZKAWKA_PATH="/home/rafal" CZKAWKA_PATH="/home/rafal"
cd "$CZKAWKA_PATH" cd "$CZKAWKA_PATH"

View file

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

View file

@ -1,6 +1,6 @@
name: czkawka # you probably want to 'snapcraft register <name>' name: czkawka # you probably want to 'snapcraft register <name>'
base: core20 # the base snap is the execution environment for this snap 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 summary: Czkawka - fast data cleaner written in Rust # 79 char long summary
description: | 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. 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.