collective

Browse / github.com/storytold/lightcraft / patch

LR-CI: fix Rust 1.95 lints and standard-font menu hints

LR-CI: fix Rust 1.95 lints and standard-font menu hints With the optional craft-fonts input unset, Reference View's empty-state hint renders U+25B8 (`▸`), which none of the bundled proportional fallback faces supplies. Egui's strict missing-glyph policy panics, failing the all-view accessibility integration test. Use the already supported `→` separator consistently in runtime menu paths, including help and error messages. Migrate matching source keys in the existing locale catalogues; all 140 translated values are preserved exactly. No new asset, font provider, font policy relaxation or test skip is introduced. Also simplify three equivalent expre

Status
open
Score
0.00
Adopters
0 other operators
Author
r3d42-git (imported from pull request #3136, open)
Base
662df66f1c08bdb1b1f1d0c1c638c4cef936d0b0
Size
+171 −164 in 55 files
Review
pending
Shared
2026-10-28
Id
ef5eccbe89b745fd7d3d9a62

How it went

No other operator has reported using it yet.

Diff

raw · apps/lightcraft/src/editors.rs apps/lightcraft/src/launch.rs apps/lightcraft/src/native_menu.rs crates/engine/src/cmd/export.rs crates/engine/src/cmd/face_detect.rs crates/engine/src/cmd/face_models.rs crates/engine/src/cmd/geocode.rs crates/engine/src/denoise/model.rs crates/engine/src/lib.rs crates/engine/src/segment/worker.rs crates/ui-egui/locales/cs-formats.json crates/ui-egui/locales/cs.json crates/ui-egui/locales/de-formats.json crates/ui-egui/locales/de.json crates/ui-egui/locales/es-formats.json crates/ui-egui/locales/es.json crates/ui-egui/locales/fi-formats.json crates/ui-egui/locales/fi.json crates/ui-egui/locales/fr-formats.json crates/ui-egui/locales/fr.json crates/ui-egui/locales/id-formats.json crates/ui-egui/locales/id.json crates/ui-egui/locales/it-formats.json crates/ui-egui/locales/it.json crates/ui-egui/locales/ja-formats.json crates/ui-egui/locales/ja.json crates/ui-egui/locales/ka-formats.json crates/ui-egui/locales/ka.json crates/ui-egui/locales/pl-formats.json crates/ui-egui/locales/pl.json crates/ui-egui/locales/pt-br-formats.json crates/ui-egui/locales/pt-br.json crates/ui-egui/locales/ru-formats.json crates/ui-egui/locales/ru.json crates/ui-egui/locales/sv-formats.json crates/ui-egui/locales/sv.json crates/ui-egui/locales/uk-formats.json crates/ui-egui/locales/uk.json crates/ui-egui/locales/vi-formats.json crates/ui-egui/locales/vi.json crates/ui-egui/locales/zh-hans-formats.json crates/ui-egui/locales/zh-hans.json crates/ui-egui/locales/zh-hant-formats.json crates/ui-egui/locales/zh-hant.json crates/ui-egui/src/dialogs/import/task.rs crates/ui-egui/src/dialogs/rules_editor/rules_move.rs crates/ui-egui/src/dialogs/settings/general.rs crates/ui-egui/src/dialogs/settings/libraries.rs crates/ui-egui/src/menus/files.rs crates/ui-egui/src/menus/run.rs crates/ui-egui/src/panels/compare.rs crates/ui-egui/src/panels/detail/masks.rs crates/ui-egui/src/panels/grid.rs crates/ui-egui/src/panels/keywording.rs crates/ui-egui/src/panels/mask_effects.rs

diff --git a/apps/lightcraft/src/editors.rs b/apps/lightcraft/src/editors.rs--- a/apps/lightcraft/src/editors.rs+++ b/apps/lightcraft/src/editors.rs@@ -111,6 +111,7 @@ fn windows_default_command(path: &str) -> Command {     c } +/// Resolve an external editor name to its platform launcher, reporting when PhotoCraft is missing. fn launcher(app: &str) -> Result<Launcher, String> {     let app = app.trim();     if app.is_empty() {@@ -120,7 +121,7 @@ fn launcher(app: &str) -> Result<Launcher, String> {         return Ok(if cfg!(target_os = "macos") { Launcher::MacApp(app.to_string()) } else { Launcher::Program(PathBuf::from(app)) });     }     find_photocraft().ok_or_else(|| {-        "PhotoCraft isn't installed. Get it from getartcraft.com/apps/photocraft, or give where it is in Settings ▸ External Editing.".to_string()+        "PhotoCraft isn't installed. Get it from getartcraft.com/apps/photocraft, or give where it is in Settings → External Editing.".to_string()     }) } diff --git a/apps/lightcraft/src/launch.rs b/apps/lightcraft/src/launch.rs--- a/apps/lightcraft/src/launch.rs+++ b/apps/lightcraft/src/launch.rs@@ -36,6 +36,8 @@ pub(crate) fn launch_imports(args: &[String]) -> (Vec<String>, Vec<String>) {     launch_imports_in(args, cwd.as_deref(), home.as_deref()) } +/// Split launch arguments into importable paths and refusal notices. Relative paths use `cwd`;+/// `home` identifies the whole home folder, which must not be imported. pub(crate) fn launch_imports_in(args: &[String], cwd: Option<&std::path::Path>, home: Option<&std::path::Path>) -> (Vec<String>, Vec<String>) {     use lightcraft_engine::import::{LaunchPath, launch_path};     let (mut files, mut notices) = (Vec::new(), Vec::new());@@ -45,7 +47,7 @@ pub(crate) fn launch_imports_in(args: &[String], cwd: Option<&std::path::Path>,             Some(LaunchPath::Refused { path, why }) => {                 log::warn!("not importing {path} given at launch: {why}");                 notices-                    .push(format!("{path} was not imported: it is {why}. To import from it, choose a folder inside it with File ▸ Import Photos…"));+                    .push(format!("{path} was not imported: it is {why}. To import from it, choose a folder inside it with File → Import Photos…"));             }             None => {}         }@@ -85,7 +87,7 @@ pub(crate) fn stopped_text(error: &str, lost: Option<&str>) -> String {     match lost {         Some(reason) => format!(             "{error}. The graphics driver reset the GPU ({reason}). LightCraft renders on the CPU from its next start; \-             Settings ▸ Performance ▸ Use the GPU for rendering turns the GPU back on"+             Settings → Performance → Use the GPU for rendering turns the GPU back on"         ),         None => error.to_string(),     }diff --git a/apps/lightcraft/src/native_menu.rs b/apps/lightcraft/src/native_menu.rs--- a/apps/lightcraft/src/native_menu.rs+++ b/apps/lightcraft/src/native_menu.rs@@ -489,9 +489,7 @@ impl NativeMenu {             // events never reach `shortcuts::handle`, so this is the one guard for AppKit's             // accelerators and clicks: while the blocking library window or a quit/settings notice             // owns input, a queued command is dropped (Quit stays for the existing confirmation).-            let (cmd, params) = if key == QUIT {-                (key, serde_json::json!({}))-            } else if key == "app.about" || key == SETTINGS {+            let (cmd, params) = if key == QUIT || key == "app.about" || key == SETTINGS {                 (key, serde_json::json!({}))             } else if let Some(it) = self.items.get(&key) {                 (it.cmd.clone(), it.params.clone())diff --git a/crates/engine/src/cmd/export.rs b/crates/engine/src/cmd/export.rs--- a/crates/engine/src/cmd/export.rs+++ b/crates/engine/src/cmd/export.rs@@ -38,7 +38,7 @@ impl Session {         }         // the preset's depth is judged against the format written, known only now (`path`); a         // depth the call passes itself is the caller's, and validated as such-        if !p.get("bitDepth").is_some_and(|d| !d.is_null()) {+        if p.get("bitDepth").is_none_or(|d| d.is_null()) {             crate::export::ExportOptions::drop_unfit_depth(&mut out, fallback);         }         Ok(out)diff --git a/crates/engine/src/cmd/face_detect.rs b/crates/engine/src/cmd/face_detect.rs--- a/crates/engine/src/cmd/face_detect.rs+++ b/crates/engine/src/cmd/face_detect.rs@@ -297,6 +297,7 @@ fn detect(s: &mut Session, p: &Value) -> Result<Value> {     Ok(json!({"detector": LABEL, "applied": applied, "photos": results, "ms": started.elapsed().as_secs_f64() * 1000.0})) } +/// Describe the face detection and face-model device query commands. pub fn specs() -> Vec<CommandSpec> {     vec![         cmd!(@@ -313,7 +314,7 @@ pub fn specs() -> Vec<CommandSpec> {             "Face Models on the GPU",             [],             None,-            "{cpuOnly?: bool} → {cpuOnly, detection, recognition}: where the face models run, each as {checking, device, why} (null until it is loaded). The GPU is used only after a background check shows it gives the CPU's results faster; `cpuOnly: true` keeps every face model on the CPU (Settings ▸ Faces), `false` checks the GPU again",+            "{cpuOnly?: bool} → {cpuOnly, detection, recognition}: where the face models run, each as {checking, device, why} (null until it is loaded). The GPU is used only after a background check shows it gives the CPU's results faster; `cpuOnly: true` keeps every face model on the CPU (Settings → Faces), `false` checks the GPU again",             always,             gpu         ),diff --git a/crates/engine/src/cmd/face_models.rs b/crates/engine/src/cmd/face_models.rs--- a/crates/engine/src/cmd/face_models.rs+++ b/crates/engine/src/cmd/face_models.rs@@ -501,6 +501,7 @@ fn select(s: &mut Session, p: &Value) -> Result<Value> {     Ok(json!({"embedder": st.embedder})) } +/// Enable or disable face recognition, requiring an installed recognition model when enabling it. fn enable(s: &mut Session, p: &Value) -> Result<Value> {     const C: &str = "faces.enable";     let dir = models_dir(s, C)?;@@ -511,7 +512,7 @@ fn enable(s: &mut Session, p: &Value) -> Result<Value> {     let usable =         st.embedder.as_deref().is_some_and(|id| installed_models(&dir).iter().any(|i| i.manifest.id == id && i.manifest.role == Role::Embedder));     if on && !usable {-        return Err(bad(C, "choose a recognition model first (Settings ▸ Faces ▸ Use)"));+        return Err(bad(C, "choose a recognition model first (Settings → Faces → Use)"));     }     st.enabled = on;     write_settings(&dir, &st)?;diff --git a/crates/engine/src/cmd/geocode.rs b/crates/engine/src/cmd/geocode.rs--- a/crates/engine/src/cmd/geocode.rs+++ b/crates/engine/src/cmd/geocode.rs@@ -119,6 +119,8 @@ fn fill(meta: &mut lightcraft_catalog::Meta, place: &lightcraft_geocode::Place,     } } +/// Populate place metadata for targeted photos with valid GPS coordinates using the local database.+/// Existing fields are preserved unless `overwrite` is requested. fn reverse(s: &mut Session, p: &Value) -> Result<Value> {     const C: &str = "metadata.reverseGeocode";     let overwrite = bool_or(p, "overwrite", false);@@ -141,7 +143,7 @@ fn reverse(s: &mut Session, p: &Value) -> Result<Value> {         return Err(bad(C, "none of these photos has a GPS position"));     }     let dir = dataset_dir(p).ok_or_else(|| bad(C, "no settings folder: give `dataset`"))?;-    let names = s.place_names.load(&dir).map_err(|e| bad(C, format!("{e}: download the place names first (Photo ▸ Download Place Names)")))?;+    let names = s.place_names.load(&dir).map_err(|e| bad(C, format!("{e}: download the place names first (Photo → Download Place Names)")))?;     // a large selection shows in the activity stack and can be stopped     let task = (todo.len() > 1).then(|| s.activity.start("geocode", "Looking up places", Cancel::Yes));     let mut ops = Vec::new();diff --git a/crates/engine/src/denoise/model.rs b/crates/engine/src/denoise/model.rs--- a/crates/engine/src/denoise/model.rs+++ b/crates/engine/src/denoise/model.rs@@ -409,7 +409,7 @@ pub fn serving(dir: Option<&Path>, id: Option<&str>, run_on: RunOn) -> Result<Se     let want = match id {         Some(i) => i.to_string(),         None => read_settings(&dir).model.ok_or_else(|| {-            format!("no denoise model is selected in {} (install one in Settings ▸ AI Denoise, or name it with --model)", dir.display())+            format!("no denoise model is selected in {} (install one in Settings → AI Denoise, or name it with --model)", dir.display())         })?,     };     let installed = installed_models(&dir)diff --git a/crates/engine/src/lib.rs b/crates/engine/src/lib.rs--- a/crates/engine/src/lib.rs+++ b/crates/engine/src/lib.rs@@ -115,7 +115,7 @@ pub enum EngineError {     /// The folder (or file) asked for is a Lightroom Classic catalog or part of one, not a     /// LightCraft library (issue #891): nothing was created or opened. `catalog`: the `.lrcat`     /// to import with `library.importLightroom`, when one was found.-    #[error("{} is a Lightroom Classic catalog, not a LightCraft library; import it into a LightCraft library with File ▸ Import Lightroom Catalog…{}", path.display(), catalog.as_ref().map_or(String::new(), |c| format!(" ({})", c.display())))]+    #[error("{} is a Lightroom Classic catalog, not a LightCraft library; import it into a LightCraft library with File → Import Lightroom Catalog…{}", path.display(), catalog.as_ref().map_or(String::new(), |c| format!(" ({})", c.display())))]     LightroomCatalog { path: std::path::PathBuf, catalog: Option<std::path::PathBuf> },     /// The work was cancelled (by the person, an agent or a newer request): not a failure.     #[error("{0}")]diff --git a/crates/engine/src/segment/worker.rs b/crates/engine/src/segment/worker.rs--- a/crates/engine/src/segment/worker.rs+++ b/crates/engine/src/segment/worker.rs@@ -379,7 +379,7 @@ fn render(job: &mut Job) -> Result<Input, String> {         Err(e) => {             return Err(match &job.missing {                 Some(path) => format!(-                    "This photo's file is missing (moved or deleted), so it can't be analyzed for AI masks: {path}. Library ▸ Find Missing Photos can relink it."+                    "This photo's file is missing (moved or deleted), so it can't be analyzed for AI masks: {path}. Library → Find Missing Photos can relink it."                 ),                 None => format!("couldn't render the photo for AI masks: {e}"),             });diff --git a/crates/ui-egui/locales/cs-formats.json b/crates/ui-egui/locales/cs-formats.json--- a/crates/ui-egui/locales/cs-formats.json+++ b/crates/ui-egui/locales/cs-formats.json@@ -35,7 +35,7 @@   "Added “{keyword}” to {n} photo{}": "K fotografiím přidáno „{keyword}“: {n}{:.0}",   "Adding photos… {} of {}": "Přidávání fotografií… {} z {}",   "All {n} selected photos move by the same amount.": "Všech {n} vybraných fotografií se posune o stejnou hodnotu.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Již v knihovně, v nedávno odstraněných: vybrané fotografie: {}{:.0} · pravé tlačítko → Obnovit, nebo Trvale odstranit pro nový import",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Již v knihovně, v nedávno odstraněných: vybrané fotografie: {}{:.0} · pravé tlačítko → Obnovit, nebo Trvale odstranit pro nový import",   "Already in the library: {} photo{} selected in All Photos": "Již v knihovně: ve všech fotografiích vybráno: {}{:.0}",   "Auto ({})": "Automaticky ({})",   "Auto Import: added {} photo{}": "Automatický import: přidáno fotografií: {}{:.0}",@@ -80,7 +80,7 @@   "Imported {n} point curve preset{}": "Importovaná přednastavení bodové křivky: {n}{:.0}",   "Imported {n} preset{}": "Importovaná přednastavení: {n}{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "Importovaná přednastavení: {n}{0:.0}, nečitelné soubory: {f}{1:.0}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Importované profily: {profiles}{:.0} (Prohlížeč profilů → jejich skupiny)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Importované profily: {profiles}{:.0} (Prohlížeč profilů → jejich skupiny)",   "Imported {} photo{}": "Importováno fotografií: {}{:.0}",   "In line for AI Denoise ({ahead} ahead)…": "Ve frontě na redukci šumu pomocí AI (před vámi: {ahead})…",   "Insert at the cursor (also written {})": "Vložit na pozici kurzoru (také se zapisuje {})",@@ -206,7 +206,7 @@   "{n} photo{}": "fotografií: {n}{:.0}",   "{n} photo{} match · updates automatically as photos change": "Odpovídající fotografie: {n}{:.0} · aktualizuje se automaticky při změnách fotografií",   "{n} photo{} now · updates automatically as photos change": "Aktuální fotografie: {n}{:.0} · aktualizuje se automaticky při změnách fotografií",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "Podobné fotografie: {n}{:.0} · Zobrazení → Zrušit filtry zobrazí všechny",+  "{n} similar photo{} · View → Clear Filters to see all": "Podobné fotografie: {n}{:.0} · Zobrazení → Zrušit filtry zobrazí všechny",   "{n} tasks are still running: {names}. Quitting stops them.": "Stále běží úlohy: {n}: {names}. Ukončení aplikace je zastaví.",   "{n} {noun}": "{noun}: {n}",   "{pct} %": "{pct} %",@@ -252,7 +252,7 @@   "Create the keyword “{name}”": "Vytvořit klíčové slovo „{name}“",   "new, inside {parent}": "nové, pod {parent}",   "Keywords of {n} selected photos": "Klíčová slova vybraných fotografií (počet: {n})",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "Klíčové slovo „{name}“ bylo odebráno z fotografií v počtu {n}. Úpravy → Zpět jej vrátí.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "Klíčové slovo „{name}“ bylo odebráno z fotografií v počtu {n}. Úpravy → Zpět jej vrátí.",   "Inside: {names}": "Uvnitř: {names}",   " in {g} group{}": " ve skupinách: {g}{:.0}",   " · kept, not applied: {}": " · zachováno, nepoužito: {}",@@ -263,7 +263,7 @@   "Delete {n} effect preset{}? This can't be undone.": "Odstranit přednastavení efektů v počtu {n}{:.0}? Tuto akci nelze vrátit zpět.",   "Effect: {name}": "Efekt: {name}",   "Exported {} effect preset{}": "Exportováno přednastavení efektů: {0}{1:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Importováno efektů masek: {e}{:.0} (Maskování → Efekt)",+  "Imported {e} mask effect{} (Masking → Effect)": "Importováno efektů masek: {e}{:.0} (Maskování → Efekt)",   "Update “{name}” with Current Settings": "Aktualizovat „{name}“ podle aktuálního nastavení",   "{n} preset{}": "Přednastavení: {n}{:.0}",   "{count} more warnings.": "Další varování: {count}.",diff --git a/crates/ui-egui/locales/cs.json b/crates/ui-egui/locales/cs.json--- a/crates/ui-egui/locales/cs.json+++ b/crates/ui-egui/locales/cs.json@@ -1358,7 +1358,7 @@   "Photo Grid": "Mřížka fotografií",   "Photo Grid (G)": "Mřížka fotografií (G)",   "Photo Merge": "Sloučení fotografií",-  "Photo ▸ Edit In ▸ Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Fotografie → Upravit v → Upravit v PhotoCraft (⇧⌘E nebo pravé tlačítko na fotografii) vykreslí kopii s vašimi úpravami, přidá ji do sady s originálem a otevře v PhotoCraft. Po uložení se kopie zde aktualizuje. Do PSD ukládá PhotoCraft přímo. Umístění ponechte prázdné, pokud nepoužíváte přenosnou kopii.",+  "Photo → Edit In → Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Fotografie → Upravit v → Upravit v PhotoCraft (⇧⌘E nebo pravé tlačítko na fotografii) vykreslí kopii s vašimi úpravami, přidá ji do sady s originálem a otevře v PhotoCraft. Po uložení se kopie zde aktualizuje. Do PSD ukládá PhotoCraft přímo. Umístění ponechte prázdné, pokud nepoužíváte přenosnou kopii.",   "Photo ▸ Edit in External Editor (⇧⌘E) renders a 16-bit TIFF copy, stacks it with the original and opens it here (an app name on macOS, a program path elsewhere).": "Fotografie → Upravit v externím editoru (⇧⌘E) vykreslí 16bitovou kopii TIFF, přidá ji do sady s originálem a otevře v této aplikaci (název aplikace v macOS, jinde cesta k programu).",   "PhotoCraft": "PhotoCraft",   "Photos": "Fotografie",@@ -1544,7 +1544,7 @@   "Remove location info": "Odebrat informace o poloze",   "Remove missing photos from the library": "Odebrat chybějící fotografie z knihovny",   "Remove shortcut": "Odebrat zkratku",-  "Remove this face box (undo with Edit ▸ Undo)": "Odebrat tento rámeček obličeje (vrátit přes Úpravy → Zpět)",+  "Remove this face box (undo with Edit → Undo)": "Odebrat tento rámeček obličeje (vrátit přes Úpravy → Zpět)",   "Remove this filter": "Odebrat tento filtr",   "Remove this group": "Odebrat tuto skupinu",   "Remove this rule": "Odebrat toto pravidlo",@@ -1584,7 +1584,7 @@   "Reset all curves: point curves (all channels) and parametric (double-click a channel to reset only that one)": "Obnoví všechny křivky: bodové (všechny kanály) i parametrickou (dvojklik na kanál obnoví pouze tento kanál)",   "Reset all edits": "Obnovit všechny úpravy",   "Reset all edits (Cmd+Shift+R)": "Obnovit všechny úpravy (Cmd+Shift+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Inteligentní alba se aktualizují automaticky: změňte jejich pravidla nebo použijte Fotografie → Odstranit fotografii",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Inteligentní alba se aktualizují automaticky: změňte jejich pravidla nebo použijte Fotografie → Odstranit fotografii",   "LightCraft stopped": "LightCraft se neočekávaně ukončil",   "Zoom to Focus Point": "Přiblížit na zaostřovací bod",   "Focus": "Zaostření",@@ -1630,7 +1630,7 @@   "Revert": "Vrátit změny",   "Review": "Zkontrolovat",   "Review Import": "Zkontrolovat import",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Pravé tlačítko na fotografii → Nastavit jako referenční fotografii, pak Zobrazení → Referenční zobrazení (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Pravé tlačítko na fotografii → Nastavit jako referenční fotografii, pak Zobrazení → Referenční zobrazení (Shift+R)",   "Right-click a preset to delete it": "Přednastavení odstraníte kliknutím pravým tlačítkem",   "Rights Usage Terms": "Podmínky použití práv",   "Rotate": "Otočit",diff --git a/crates/ui-egui/locales/de-formats.json b/crates/ui-egui/locales/de-formats.json--- a/crates/ui-egui/locales/de-formats.json+++ b/crates/ui-egui/locales/de-formats.json@@ -25,7 +25,7 @@   "Added {what} to {name}": "{what} zu {name} hinzugefügt",   "Adding photos… {} of {}": "Fotos werden hinzugefügt… {} von {}",   "All {n} selected photos move by the same amount.": "Alle {n} ausgewählten Fotos werden um denselben Betrag verschoben.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Bereits in der Bibliothek unter „Zuletzt gelöscht“: {} Foto{} ausgewählt · Rechtsklick → Wiederherstellen, oder endgültig löschen, um neu zu importieren",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Bereits in der Bibliothek unter „Zuletzt gelöscht“: {} Foto{} ausgewählt · Rechtsklick → Wiederherstellen, oder endgültig löschen, um neu zu importieren",   "Already in the library: {} photo{} selected in All Photos": "Bereits in der Bibliothek: {} Foto{} in „Alle Fotos“ ausgewählt",   "Auto ({})": "Automatisch ({})",   "Auto Import: added {} photo{}": "Automatischer Import: {} Foto{} hinzugefügt",@@ -72,7 +72,7 @@   "Imported {n} point curve preset{}": "Importierte Punktkurvenvorgaben: {n}{:.0}",   "Imported {n} preset{}": "Importierte Vorgaben: {n}{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "Importierte Vorgaben: {n}{0:.0}, nicht lesbare Dateien: {f}{1:.0}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Importierte Profile: {profiles}{:.0} (Profilbrowser → jeweilige Gruppen)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Importierte Profile: {profiles}{:.0} (Profilbrowser → jeweilige Gruppen)",   "Imported {} photo{}": "{} Foto{} importiert",   "Insert at the cursor (also written {})": "An Cursorposition einfügen (auch als {} geschrieben)",   "Label Set: {name}": "Farbmarkierungssatz: {name}",@@ -195,7 +195,7 @@   "… and {more} more": "… und {more} weitere",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft kann diese RAW-Variante noch nicht dekodieren ({}). Du bearbeitest die eingebettete JPEG-Vorschau der Kamera. Sie enthält bereits deren Bildstil (z. B. Monochrom) und Weißabgleich.",   "Filtered: {label}": "Gefiltert: {label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "Ähnliche Fotos: {n}{:.0} · Ansicht → Filter löschen zeigt alle Fotos",+  "{n} similar photo{} · View → Clear Filters to see all": "Ähnliche Fotos: {n}{:.0} · Ansicht → Filter löschen zeigt alle Fotos",   "Moved; {} photo(s) relinked": "Verschoben; {} Foto(s) neu verknüpft",   "{} label (click more labels to show any of them)": "Farbmarkierung {} (weitere Farbmarkierungen auswählen, um alle passenden Fotos zu zeigen)",   ", {} star{}": ", Sterne: {}{:.0}",@@ -242,7 +242,7 @@   "Create the keyword “{name}”": "Stichwort „{name}“ erstellen",   "new, inside {parent}": "neu, in {parent}",   "Keywords of {n} selected photos": "Stichwörter von {n} ausgewählten Fotos",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "„{name}“ von {n} Fotos entfernt. Bearbeiten → Rückgängig stellt es wieder her.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "„{name}“ von {n} Fotos entfernt. Bearbeiten → Rückgängig stellt es wieder her.",   "1 task is still running: {names}. Quitting stops it.": "1 Aufgabe läuft noch: {names}. Beenden bricht sie ab.",   "{n} tasks are still running: {names}. Quitting stops them.": "{n} Aufgaben laufen noch: {names}. Beenden bricht sie ab.",   "{what} merge cancelled": "{what}-Zusammenfügung abgebrochen",@@ -262,7 +262,7 @@   "Delete {n} effect preset{}? This can't be undone.": "{n} Effektvorgabe(n) löschen?{:.0} Dies kann nicht rückgängig gemacht werden.",   "Effect: {name}": "Effekt: {name}",   "Exported {} effect preset{}": "Exportierte Effektvorgaben: {}{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "{e} Maskeneffekt(e) importiert{:.0} (Maskieren → Effekt)",+  "Imported {e} mask effect{} (Masking → Effect)": "{e} Maskeneffekt(e) importiert{:.0} (Maskieren → Effekt)",   "Update “{name}” with Current Settings": "„{name}“ mit aktuellen Einstellungen aktualisieren",   "{n} preset{}": "{n} Vorgabe(n){:.0}",   "{name} opened in the other editor": "{name} im anderen Editor geöffnet",diff --git a/crates/ui-egui/locales/de.json b/crates/ui-egui/locales/de.json--- a/crates/ui-egui/locales/de.json+++ b/crates/ui-egui/locales/de.json@@ -1239,7 +1239,7 @@   "Remove from survey": "Aus Übersicht entfernen",   "Remove location info": "Ortsinformationen entfernen",   "Remove shortcut": "Tastenkürzel entfernen",-  "Remove this face box (undo with Edit ▸ Undo)": "Diesen Gesichtsrahmen entfernen (rückgängig über Bearbeiten → Rückgängig)",+  "Remove this face box (undo with Edit → Undo)": "Diesen Gesichtsrahmen entfernen (rückgängig über Bearbeiten → Rückgängig)",   "Remove this filter": "Diesen Filter entfernen",   "Remove this group": "Diese Gruppe entfernen",   "Remove this rule": "Diese Regel entfernen",@@ -1295,7 +1295,7 @@   "Revert": "Zurück zum letzten Stand",   "Review": "Überprüfung",   "Review Import": "Import überprüfen",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Rechtsklick auf ein Foto → Als Referenzfoto festlegen, dann Ansicht → Referenzansicht (Umschalt+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Rechtsklick auf ein Foto → Als Referenzfoto festlegen, dann Ansicht → Referenzansicht (Umschalt+R)",   "Right-click a preset to delete it": "Rechtsklick auf eine Vorgabe, um sie zu löschen",   "Rights Usage Terms": "Nutzungsbedingungen",   "Rotate": "Drehen",@@ -2313,7 +2313,7 @@   "Same folder as original photo": "Im selben Ordner wie das Originalfoto",   "Tidying the thumbnail cache": "Miniaturcache wird aufgeräumt",   "Reset all edits (Cmd+Shift+R)": "Alle Bearbeitungen zurücksetzen (⌘⇧R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Smart-Alben aktualisieren sich selbst: Ändere ihre Regeln oder verwende Foto → Foto löschen",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Smart-Alben aktualisieren sich selbst: Ändere ihre Regeln oder verwende Foto → Foto löschen",   "LightCraft stopped": "LightCraft wurde beendet",   "Zoom to Focus Point": "Auf Fokuspunkt zoomen",   "Focus": "Fokus",diff --git a/crates/ui-egui/locales/es-formats.json b/crates/ui-egui/locales/es-formats.json--- a/crates/ui-egui/locales/es-formats.json+++ b/crates/ui-egui/locales/es-formats.json@@ -25,7 +25,7 @@   "Added {what} to {name}": "{what} añadido a {name}",   "Adding photos… {} of {}": "Añadiendo fotos… {} de {}",   "All {n} selected photos move by the same amount.": "Las {n} fotos seleccionadas se desplazan la misma cantidad.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Ya en la biblioteca, en Eliminadas recientemente: {0} foto{1} seleccionada{1} · clic derecho → Restaurar, o Eliminar definitivamente para importar de nuevo",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Ya en la biblioteca, en Eliminadas recientemente: {0} foto{1} seleccionada{1} · clic derecho → Restaurar, o Eliminar definitivamente para importar de nuevo",   "Already in the library: {} photo{} selected in All Photos": "Ya en la biblioteca: {0} foto{1} seleccionada{1} en Todas las fotos",   "Auto ({})": "Automático ({})",   "Auto Import: added {} photo{}": "Importación automática: {0} foto{1} añadida{1}",@@ -72,7 +72,7 @@   "Imported {n} point curve preset{}": "{n} ajuste{0} preestablecido{0} de curva de puntos importado{0}",   "Imported {n} preset{}": "{n} ajuste{0} preestablecido{0} importado{0}",   "Imported {n} preset{}, {f} file{} not readable": "{n} ajuste{0} preestablecido{0} importado{0}, {f} archivo{1} ilegible{1}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Perfiles importados: {profiles}{:.0} (Explorador de perfiles → sus grupos)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Perfiles importados: {profiles}{:.0} (Explorador de perfiles → sus grupos)",   "Imported {} photo{}": "{0} foto{1} importada{1}",   "Insert at the cursor (also written {})": "Insertar en el cursor (también se escribe {})",   "Label Set: {name}": "Conjunto de etiquetas: {name}",@@ -195,7 +195,7 @@   "… and {more} more": "… y {more} más",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft aún no puede decodificar esta variante RAW ({}). Se está editando la vista previa JPEG incrustada de la cámara, que ya incluye el estilo de imagen de la cámara (p. ej. Monocromo) y el balance de blancos.",   "Filtered: {label}": "Filtrado: {label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "Fotos similares: {n}{:.0} · Vista → Borrar filtros para ver todas",+  "{n} similar photo{} · View → Clear Filters to see all": "Fotos similares: {n}{:.0} · Vista → Borrar filtros para ver todas",   "Moved; {} photo(s) relinked": "Movida; {} foto(s) vinculada(s) de nuevo",   "{} label (click more labels to show any of them)": "Etiqueta {} (hacer clic en más etiquetas para mostrar cualquiera de ellas)",   ", {} star{}": ", {} estrella{}",@@ -242,7 +242,7 @@   "Create the keyword “{name}”": "Crear la palabra clave “{name}”",   "new, inside {parent}": "nueva, dentro de {parent}",   "Keywords of {n} selected photos": "Palabras clave de {n} fotos seleccionadas",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "“{name}” quitada de {n} fotos. Editar → Deshacer la devuelve.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "“{name}” quitada de {n} fotos. Editar → Deshacer la devuelve.",   "1 task is still running: {names}. Quitting stops it.": "1 tarea sigue en curso: {names}. Salir la detiene.",   "{n} tasks are still running: {names}. Quitting stops them.": "{n} tareas siguen en curso: {names}. Salir las detiene.",   "{what} merge cancelled": "Combinación {what} cancelada",@@ -262,7 +262,7 @@   "Delete {n} effect preset{}? This can't be undone.": "¿Eliminar {n} ajuste(s) preestablecido(s) de efecto?{:.0} No se puede deshacer.",   "Effect: {name}": "Efecto: {name}",   "Exported {} effect preset{}": "Ajustes de efecto exportados: {}{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "{e} efecto(s) de máscara importado(s){:.0} (Máscaras → Efecto)",+  "Imported {e} mask effect{} (Masking → Effect)": "{e} efecto(s) de máscara importado(s){:.0} (Máscaras → Efecto)",   "Update “{name}” with Current Settings": "Actualizar «{name}» con los ajustes actuales",   "{n} preset{}": "{n} ajuste(s){:.0}",   "{name} opened in the other editor": "{name} abierto en el otro editor",diff --git a/crates/ui-egui/locales/es.json b/crates/ui-egui/locales/es.json--- a/crates/ui-egui/locales/es.json+++ b/crates/ui-egui/locales/es.json@@ -1246,7 +1246,7 @@   "Remove from survey": "Quitar de Encuesta",   "Remove location info": "Quitar información de ubicación",   "Remove shortcut": "Quitar método abreviado",-  "Remove this face box (undo with Edit ▸ Undo)": "Quitar este recuadro de cara (deshacer con Editar → Deshacer)",+  "Remove this face box (undo with Edit → Undo)": "Quitar este recuadro de cara (deshacer con Editar → Deshacer)",   "Remove this filter": "Quitar este filtro",   "Remove this group": "Quitar este grupo",   "Remove this rule": "Quitar esta regla",@@ -1302,7 +1302,7 @@   "Revert": "Revertir",   "Review": "Revisión",   "Review Import": "Revisar importación",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Clic derecho en una foto → Definir como foto de referencia y, después, Vista → Vista de referencia (Mayús+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Clic derecho en una foto → Definir como foto de referencia y, después, Vista → Vista de referencia (Mayús+R)",   "Right-click a preset to delete it": "Clic derecho en un ajuste preestablecido para eliminarlo",   "Rights Usage Terms": "Condiciones de uso de los derechos",   "Rotate": "Rotar",@@ -2316,7 +2316,7 @@   "Same folder as original photo": "Misma carpeta que la foto original",   "Tidying the thumbnail cache": "Ordenando la caché de miniaturas",   "Reset all edits (Cmd+Shift+R)": "Restablecer todas las ediciones (Cmd+Mayús+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Los álbumes inteligentes se actualizan solos: cambie sus reglas o use Foto → Eliminar foto",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Los álbumes inteligentes se actualizan solos: cambie sus reglas o use Foto → Eliminar foto",   "LightCraft stopped": "LightCraft se detuvo",   "Focus Point": "Punto de enfoque",   "Zoom to Focus Point": "Zoom al punto de enfoque",diff --git a/crates/ui-egui/locales/fi-formats.json b/crates/ui-egui/locales/fi-formats.json--- a/crates/ui-egui/locales/fi-formats.json+++ b/crates/ui-egui/locales/fi-formats.json@@ -39,7 +39,7 @@   "Added “{keyword}” to {n} photo{}": "Avainsana ”{keyword}” lisätty kuviin: {n}{:.0}",   "Adding photos… {} of {}": "Lisätään kuvia… {} / {}",   "All {n} selected photos move by the same amount.": "Kaikkia valittuja kuvia ({n}) siirretään saman verran.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Jo kirjastossa, Äskettäin poistetuissa: valittuja kuvia {}{:.0} · napsauta hiiren kakkospainikkeella → Palauta tai Poista pysyvästi tuodaksesi uudelleen",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Jo kirjastossa, Äskettäin poistetuissa: valittuja kuvia {}{:.0} · napsauta hiiren kakkospainikkeella → Palauta tai Poista pysyvästi tuodaksesi uudelleen",   "Already in the library: {} photo{} selected in All Photos": "Jo kirjastossa (Kaikki kuvat): valittuja kuvia {}{:.0}",   "Already in “{}”": "Jo kohteessa ”{}”",   "Applied {name}": "{name} käytetty",@@ -93,12 +93,12 @@   "Import cancelled · {} photo{} added": "Tuonti peruttu · lisättyjä kuvia: {}{:.0}",   "Import failed: {e}": "Tuonti epäonnistui: {e}",   "Import warnings ({n}):\n{warnings}": "Tuontivaroitukset ({n}):\n{warnings}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Tuotuja maskitehosteita: {e}{:.0} (Maskaus → Tehoste)",+  "Imported {e} mask effect{} (Masking → Effect)": "Tuotuja maskitehosteita: {e}{:.0} (Maskaus → Tehoste)",   "Imported {name}": "{name} tuotu",   "Imported {n} point curve preset{}": "Tuotuja pistekäyrän esiasetuksia: {n}{:.0}",   "Imported {n} preset{}": "Tuotuja esiasetuksia: {n}{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "Tuotuja esiasetuksia: {n}{:.0}, ei luettavissa olevia tiedostoja: {f}{:.0}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Tuotuja profiileja: {profiles}{:.0} (Profiiliselain → niiden ryhmät)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Tuotuja profiileja: {profiles}{:.0} (Profiiliselain → niiden ryhmät)",   "Imported {} photo{}": "Tuotuja kuvia: {}{:.0}",   "In line for AI Denoise ({ahead} ahead)…": "Jonossa tekoälykohinanpoistoon ({ahead} edellä)…",   "Insert at the cursor (also written {})": "Lisää kohdistimen kohtaan (kirjoitetaan myös {})",@@ -157,7 +157,7 @@   "Remove “{}” from Favorites": "Poista ”{}” suosikeista",   "Removed from {}": "Poistettu kohteesta {}",   "Removed {what} from {name}": "{what} poistettu kohteesta {name}",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "”{name}” poistettu {n} kuvalta. Muokkaa → Kumoa palauttaa sen.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "”{name}” poistettu {n} kuvalta. Muokkaa → Kumoa palauttaa sen.",   "Rename {n} Photos…": "Nimeä uudelleen {n} kuvaa…",   "Rename “{name}”": "Nimeä uudelleen ”{name}”",   "Renames {n} face{} across the library. The files are not changed.": "Nimeää uudelleen kasvoja koko kirjastossa: {n}{:.0}. Tiedostoja ei muuteta.",@@ -249,7 +249,7 @@   "{n} preset{}": "Esiasetuksia: {n}{:.0}",   "{n} raws can now be developed from their raw data": "Raw-kuvia, jotka voidaan nyt kehittää raakadatastaan: {n}",   "{n} selected photos · {pages} pages": "Valittuja kuvia: {n} · sivuja: {pages}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "Samankaltaisia kuvia: {n}{:.0} · Näytä → Tyhjennä suodattimet näyttääksesi kaikki",+  "{n} similar photo{} · View → Clear Filters to see all": "Samankaltaisia kuvia: {n}{:.0} · Näytä → Tyhjennä suodattimet näyttääksesi kaikki",   "{n} tasks are still running: {names}. Quitting stops them.": "Käynnissä olevia tehtäviä: {n}: {names}. Lopettaminen pysäyttää ne.",   "{n} {noun}": "{n} {noun}",   "{pct} %": "{pct} %",diff --git a/crates/ui-egui/locales/fi.json b/crates/ui-egui/locales/fi.json--- a/crates/ui-egui/locales/fi.json+++ b/crates/ui-egui/locales/fi.json@@ -1414,7 +1414,7 @@   "Photo Grid": "Kuvaruudukko",   "Photo Grid (G)": "Kuvaruudukko (G)",   "Photo Merge": "Kuvien yhdistäminen",-  "Photo ▸ Edit In ▸ Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Kuva → Muokkaa ohjelmassa → Muokkaa PhotoCraftissa (⇧⌘E tai napsauta kuvaa hiiren kakkospainikkeella) renderöi kopion muokkauksineen, pinoaa sen alkuperäisen kanssa ja avaa sen PhotoCraftissa. Tallenna siellä, niin kopio päivittyy täällä. PSD-muodossa PhotoCraft tallentaa suoraan siihen. Jätä sijainti tyhjäksi, ellet käytä kannettavaa kopiota.",+  "Photo → Edit In → Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Kuva → Muokkaa ohjelmassa → Muokkaa PhotoCraftissa (⇧⌘E tai napsauta kuvaa hiiren kakkospainikkeella) renderöi kopion muokkauksineen, pinoaa sen alkuperäisen kanssa ja avaa sen PhotoCraftissa. Tallenna siellä, niin kopio päivittyy täällä. PSD-muodossa PhotoCraft tallentaa suoraan siihen. Jätä sijainti tyhjäksi, ellet käytä kannettavaa kopiota.",   "Photo ▸ Edit in External Editor (⇧⌘E) renders a 16-bit TIFF copy, stacks it with the original and opens it here (an app name on macOS, a program path elsewhere).": "Kuva → Muokkaa ulkoisessa muokkausohjelmassa (⇧⌘E) renderöi 16-bittisen TIFF-kopion, pinoaa sen alkuperäisen kanssa ja avaa sen täällä (macOS:ssä sovelluksen nimi, muualla ohjelman polku).",   "PhotoCraft": "PhotoCraft",   "Photos": "Kuvat",@@ -1613,7 +1613,7 @@   "Remove missing photos from the library": "Poista puuttuvat kuvat kirjastosta",   "Remove region": "Poista alue",   "Remove shortcut": "Poista pikakuvake",-  "Remove this face box (undo with Edit ▸ Undo)": "Poista tämä kasvorajaus (kumoa kohdasta Muokkaa → Kumoa)",+  "Remove this face box (undo with Edit → Undo)": "Poista tämä kasvorajaus (kumoa kohdasta Muokkaa → Kumoa)",   "Remove this filter": "Poista tämä suodatin",   "Remove this group": "Poista tämä ryhmä",   "Remove this rule": "Poista tämä sääntö",@@ -1677,7 +1677,7 @@   "Review": "Tarkistus",   "Review Import": "Tarkista tuonti",   "Right": "Oikea",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Napsauta kuvaa hiiren kakkospainikkeella → Aseta vertailukuvaksi, sitten Näytä → Vertailunäkymä (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Napsauta kuvaa hiiren kakkospainikkeella → Aseta vertailukuvaksi, sitten Näytä → Vertailunäkymä (Shift+R)",   "Right-click a preset to delete it": "Poista esiasetus napsauttamalla sitä hiiren kakkospainikkeella",   "Rights Usage Terms": "Oikeuksien käyttöehdot",   "Rotate": "Kierrä",@@ -1888,7 +1888,7 @@   "Smart Album Rule Fields": "Älyalbumin sääntökentät",   "Smart Preview Status": "Älyesikatselun tila",   "Smart Previews Location": "Älyesikatseluiden sijainti",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Älyalbumit päivittyvät automaattisesti: muuta niiden sääntöjä tai käytä Kuva → Poista kuva",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Älyalbumit päivittyvät automaattisesti: muuta niiden sääntöjä tai käytä Kuva → Poista kuva",   "Smart preview available": "Älyesikatselu saatavilla",   "Smart previews": "Älyesikatselut",   "Smart previews folder changed": "Älyesikatseluiden kansio muuttui",diff --git a/crates/ui-egui/locales/fr-formats.json b/crates/ui-egui/locales/fr-formats.json--- a/crates/ui-egui/locales/fr-formats.json+++ b/crates/ui-egui/locales/fr-formats.json@@ -25,7 +25,7 @@   "Added {what} to {name}": "{what} ajouté à {name}",   "Adding photos… {} of {}": "Ajout des photos… {} sur {}",   "All {n} selected photos move by the same amount.": "Les {n} photos sélectionnées se déplacent de la même valeur.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Déjà dans la bibliothèque, dans « Supprimés récemment » : {} photo{} sélectionnée(s) · clic droit → Restaurer, ou Supprimer définitivement pour importer à nouveau",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Déjà dans la bibliothèque, dans « Supprimés récemment » : {} photo{} sélectionnée(s) · clic droit → Restaurer, ou Supprimer définitivement pour importer à nouveau",   "Already in the library: {} photo{} selected in All Photos": "Déjà dans la bibliothèque : {} photo{} sélectionnée(s) dans Toutes les photos",   "Auto ({})": "Automatique ({})",   "Auto Import: added {} photo{}": "Importation automatique : {} photo{} ajoutée(s)",@@ -65,7 +65,7 @@   "Imported {n} point curve preset{}": "{n} préréglage{} de courbe à points importé(s)",   "Imported {n} preset{}": "{n} préréglage{} importé(s)",   "Imported {n} preset{}, {f} file{} not readable": "{n} préréglage{} importé(s), {f} fichier{} illisible(s)",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "{profiles} profil{} importé(s) (Navigateur de profils → leurs groupes)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "{profiles} profil{} importé(s) (Navigateur de profils → leurs groupes)",   "The XMP sidecars of {n} photos couldn't be written (is their folder offline?). LightCraft keeps trying.": "Les fichiers annexes XMP de {n} photos n'ont pas pu être écrits (leur dossier est-il hors ligne ?). LightCraft continue d'essayer.",   "XMP profile \"{profile}\" was not applied for {path}; colors may differ from Lightroom.": "Le profil XMP « {profile} » n’a pas été appliqué à {path} ; les couleurs peuvent différer de Lightroom.",   "Lightroom geometry was not preserved for {path}; {mode} will be recalculated.": "La géométrie Lightroom de {path} n’a pas été conservée ; {mode} sera recalculé.",@@ -195,7 +195,7 @@   "… and {more} more": "… et {more} de plus",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft ne peut pas encore décoder cette variante RAW ({}). Vous modifiez l’aperçu JPEG intégré de l’appareil photo, qui inclut déjà le style d’image (par ex. monochrome) et la balance des blancs de l’appareil.",   "Filtered: {label}": "Filtré : {label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "{n} photo{} similaire(s) · Affichage → Effacer les filtres pour tout voir",+  "{n} similar photo{} · View → Clear Filters to see all": "{n} photo{} similaire(s) · Affichage → Effacer les filtres pour tout voir",   "Moved; {} photo(s) relinked": "Déplacé ; {} photo(s) de nouveau associée(s)",   "{} label (click more labels to show any of them)": "Étiquette {} (cliquez sur « autres étiquettes » pour afficher celles de votre choix)",   ", {} star{}": ", {} étoile{}",@@ -242,7 +242,7 @@   "Create the keyword “{name}”": "Créer le mot-clé « {name} »",   "new, inside {parent}": "nouveau, dans {parent}",   "Keywords of {n} selected photos": "Mots-clés de {n} photos sélectionnées",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "« {name} » retiré de {n} photos. Modifier → Annuler le rétablit.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "« {name} » retiré de {n} photos. Modifier → Annuler le rétablit.",   "1 task is still running: {names}. Quitting stops it.": "1 tâche est encore en cours : {names}. Quitter l'arrête.",   "{n} tasks are still running: {names}. Quitting stops them.": "{n} tâches sont encore en cours : {names}. Quitter les arrête.",   "{what} merge cancelled": "Fusion {what} annulée",@@ -262,7 +262,7 @@   "Delete {n} effect preset{}? This can't be undone.": "Supprimer {n} paramètre(s) prédéfini(s) d’effet ?{:.0} Cette action est irréversible.",   "Effect: {name}": "Effet : {name}",   "Exported {} effect preset{}": "Paramètres d’effet exportés : {}{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "{e} effet(s) de masque importé(s){:.0} (Masquage → Effet)",+  "Imported {e} mask effect{} (Masking → Effect)": "{e} effet(s) de masque importé(s){:.0} (Masquage → Effet)",   "Update “{name}” with Current Settings": "Mettre à jour « {name} » avec les réglages actuels",   "{n} preset{}": "{n} paramètre(s){:.0}",   "{name} opened in the other editor": "{name} ouvert dans l’autre éditeur",diff --git a/crates/ui-egui/locales/fr.json b/crates/ui-egui/locales/fr.json--- a/crates/ui-egui/locales/fr.json+++ b/crates/ui-egui/locales/fr.json@@ -1180,7 +1180,7 @@   "Remove from survey": "Retirer de la vue multiple",   "Remove location info": "Supprimer les informations de lieu",   "Remove shortcut": "Supprimer le raccourci",-  "Remove this face box (undo with Edit ▸ Undo)": "Retirer ce cadre de visage (annuler avec Édition → Annuler)",+  "Remove this face box (undo with Edit → Undo)": "Retirer ce cadre de visage (annuler avec Édition → Annuler)",   "Remove this filter": "Retirer ce filtre",   "Remove this group": "Retirer ce groupe",   "Remove this rule": "Retirer cette règle",@@ -1230,7 +1230,7 @@   "Revert": "Rétablir l'original",   "Review": "Révision",   "Review Import": "Vérifier l'importation",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Clic droit sur une photo → Définir comme photo de référence, puis Affichage → Vue de référence (Maj+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Clic droit sur une photo → Définir comme photo de référence, puis Affichage → Vue de référence (Maj+R)",   "Right-click a preset to delete it": "Clic droit sur un préréglage pour le supprimer",   "Rights Usage Terms": "Conditions d'utilisation des droits",   "Rotate": "Pivoter",@@ -2312,7 +2312,7 @@   "Same folder as original photo": "Même dossier que la photo d’origine",   "Tidying the thumbnail cache": "Rangement du cache des miniatures",   "Reset all edits (Cmd+Shift+R)": "Réinitialiser toutes les retouches (Cmd+Maj+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Les albums intelligents se mettent à jour d'eux-mêmes : modifiez leurs règles ou utilisez Photo → Supprimer la photo",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Les albums intelligents se mettent à jour d'eux-mêmes : modifiez leurs règles ou utilisez Photo → Supprimer la photo",   "LightCraft stopped": "LightCraft s’est arrêté",   "Focus Point": "Point de mise au point",   "Zoom to Focus Point": "Zoomer sur le point de mise au point",diff --git a/crates/ui-egui/locales/id-formats.json b/crates/ui-egui/locales/id-formats.json--- a/crates/ui-egui/locales/id-formats.json+++ b/crates/ui-egui/locales/id-formats.json@@ -120,7 +120,7 @@   "Adding photos… {} of {}": "Menambahkan foto… {} dari {}",   " ({} in Recently Deleted)": " ({} di Baru dihapus)",   "Already in the library: {} photo{} selected in All Photos": "Sudah ada di pustaka: {} foto{:.0} dipilih di Semua foto",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Sudah ada di pustaka, di Baru dihapus: {} foto{:.0} dipilih · klik kanan → Pulihkan, atau Hapus permanen untuk mengimpor ulang",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Sudah ada di pustaka, di Baru dihapus: {} foto{:.0} dipilih · klik kanan → Pulihkan, atau Hapus permanen untuk mengimpor ulang",   "Auto ({})": "Otomatis ({})",   "Build 1:1 Previews ({scope})": "Buat pratinjau 1:1 ({scope})",   "Build Smart Previews ({scope})": "Buat pratinjau pintar ({scope})",@@ -169,7 +169,7 @@   "Lightroom geometry for {path} was not preserved; Guided Upright saved transform is unsupported.": "Geometri Lightroom untuk {path} tidak dipertahankan; transformasi Tegakkan terpandu yang tersimpan tidak didukung.",   "Lightroom geometry for {path} was not preserved; saved Upright transform is unsupported.": "Geometri Lightroom untuk {path} tidak dipertahankan; transformasi Tegakkan yang tersimpan tidak didukung.",   "XMP adjustments were not imported for {path}: {fields}.": "Penyesuaian XMP untuk {path} tidak diimpor: {fields}.",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "{profiles} profil diimpor{:.0} (Penjelajah profil → grup masing-masing)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "{profiles} profil diimpor{:.0} (Penjelajah profil → grup masing-masing)",   "Insert at the cursor (also written {})": "Sisipkan di posisi kursor (dapat juga ditulis {})",   "MIT OR Apache-2.0. Fonts: {} (OFL). Icons: original.": "MIT OR Apache-2.0. Font: {} (OFL). Ikon: orisinal.",   "Painting “{k}”: click photos to add or remove it · Esc stops": "Menerapkan “{k}”: klik foto untuk menambahkan atau menghapusnya · Esc untuk berhenti",@@ -199,7 +199,7 @@   "{} — show their photos": "{} — tampilkan foto orang ini",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft belum dapat mendekode varian raw ini ({}). Anda sedang mengedit pratinjau JPEG bawaan kamera, yang sudah menyertakan gaya gambar kamera (mis. Monokrom) dan keseimbangan putihnya.",   "Filtered: {label}": "Difilter: {label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "{n} foto serupa{:.0} · Tampilan → Hapus filter untuk melihat semua",+  "{n} similar photo{} · View → Clear Filters to see all": "{n} foto serupa{:.0} · Tampilan → Hapus filter untuk melihat semua",   "Moved; {} photo(s) relinked": "Dipindahkan; {} foto ditautkan ulang",   "{} label (click more labels to show any of them)": "Label {} (klik label lain untuk ikut menampilkan foto berlabel tersebut)",   ", {} star{}": ", {} bintang{:.0}",@@ -245,7 +245,7 @@   "Create the keyword “{name}”": "Buat kata kunci “{name}”",   "new, inside {parent}": "baru, di dalam {parent}",   "Keywords of {n} selected photos": "Kata kunci {n} foto yang dipilih",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "“{name}” dihapus dari {n} foto. Edit → Urungkan akan mengembalikannya.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "“{name}” dihapus dari {n} foto. Edit → Urungkan akan mengembalikannya.",   "1 task is still running: {names}. Quitting stops it.": "1 tugas masih berjalan: {names}. Jika keluar sekarang, tugas ini akan dihentikan.",   "{n} tasks are still running: {names}. Quitting stops them.": "{n} tugas masih berjalan: {names}. Jika keluar sekarang, semua tugas ini akan dihentikan.",   "{what} merge cancelled": "Penggabungan {what} dibatalkan",@@ -265,7 +265,7 @@   "Delete {n} effect preset{}? This can't be undone.": "Hapus {n} preset efek{:.0}? Tindakan ini tidak dapat diurungkan.",   "Effect: {name}": "Efek: {name}",   "Exported {} effect preset{}": "{} preset efek diekspor{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "{e} efek masker{:.0} diimpor (Masker → Efek)",+  "Imported {e} mask effect{} (Masking → Effect)": "{e} efek masker{:.0} diimpor (Masker → Efek)",   "Update “{name}” with Current Settings": "Perbarui “{name}” dengan pengaturan saat ini",   "{n} preset{}": "{n} preset{:.0}",   "{name} opened in the other editor": "{name} dibuka di editor lain",diff --git a/crates/ui-egui/locales/id.json b/crates/ui-egui/locales/id.json--- a/crates/ui-egui/locales/id.json+++ b/crates/ui-egui/locales/id.json@@ -1397,7 +1397,7 @@   "Photo Grid": "Grid foto",   "Photo Grid (G)": "Grid foto (G)",   "Photo Merge": "Gabung foto",-  "Photo ▸ Edit In ▸ Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Foto → Edit di → Edit di PhotoCraft (⇧⌘E, atau klik kanan foto) merender salinan beserta hasil edit Anda, menumpuknya dengan foto asli, lalu membukanya di PhotoCraft. Simpan di sana, dan salinan di sini ikut diperbarui. Jika berformat PSD, PhotoCraft menyimpan langsung ke file tersebut. Kosongkan lokasi kecuali Anda menggunakan salinan portabel.",+  "Photo → Edit In → Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Foto → Edit di → Edit di PhotoCraft (⇧⌘E, atau klik kanan foto) merender salinan beserta hasil edit Anda, menumpuknya dengan foto asli, lalu membukanya di PhotoCraft. Simpan di sana, dan salinan di sini ikut diperbarui. Jika berformat PSD, PhotoCraft menyimpan langsung ke file tersebut. Kosongkan lokasi kecuali Anda menggunakan salinan portabel.",   "Photo ▸ Edit in External Editor (⇧⌘E) renders a 16-bit TIFF copy, stacks it with the original and opens it here (an app name on macOS, a program path elsewhere).": "Foto → Edit di editor eksternal (⇧⌘E) membuat salinan TIFF 16-bit, menumpuknya dengan file asli, lalu membukanya dengan program yang diisi di sini (nama aplikasi di macOS, jalur program di sistem lain).",   "PhotoCraft": "PhotoCraft",   "Photos": "Foto",@@ -1601,7 +1601,7 @@   "Remove location info": "Hapus info lokasi",   "Remove missing photos from the library": "Keluarkan foto yang hilang dari pustaka",   "Remove shortcut": "Hapus pintasan",-  "Remove this face box (undo with Edit ▸ Undo)": "Hapus kotak wajah ini (urungkan lewat Edit → Urungkan)",+  "Remove this face box (undo with Edit → Undo)": "Hapus kotak wajah ini (urungkan lewat Edit → Urungkan)",   "Remove this filter": "Hapus filter ini",   "Remove this group": "Hapus grup ini",   "Remove this rule": "Hapus aturan ini",@@ -1668,7 +1668,7 @@   "Review": "Tinjauan",   "Review Import": "Tinjau impor",   "Right": "Kanan",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Klik kanan foto → Jadikan foto referensi, lalu Tampilan → Tampilan referensi (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Klik kanan foto → Jadikan foto referensi, lalu Tampilan → Tampilan referensi (Shift+R)",   "Right-click a preset to delete it": "Klik kanan preset untuk menghapusnya",   "Rights Usage Terms": "Ketentuan penggunaan",   "Rotate": "Putar",@@ -1887,7 +1887,7 @@   "Smart Album Rule Fields": "Kolom aturan album pintar",   "Smart Preview Status": "Status pratinjau pintar",   "Smart Previews Location": "Lokasi pratinjau pintar",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Album pintar diperbarui secara otomatis: ubah aturannya, atau gunakan Foto → Hapus foto",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Album pintar diperbarui secara otomatis: ubah aturannya, atau gunakan Foto → Hapus foto",   "Smart preview available": "Pratinjau pintar tersedia",   "Smart previews": "Pratinjau pintar",   "Smart previews folder changed": "Folder pratinjau pintar diubah",diff --git a/crates/ui-egui/locales/it-formats.json b/crates/ui-egui/locales/it-formats.json--- a/crates/ui-egui/locales/it-formats.json+++ b/crates/ui-egui/locales/it-formats.json@@ -25,7 +25,7 @@   "Added {what} to {name}": "Aggiunto a {name}: {what}",   "Adding photos… {} of {}": "Aggiunta delle foto… {} di {}",   "All {n} selected photos move by the same amount.": "Tutte le {n} foto selezionate si spostano della stessa quantità.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Già nella libreria, in Eliminate di recente: foto selezionate {}{:.0} · clic destro → Ripristina, oppure Elimina definitivamente per importarle da capo",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Già nella libreria, in Eliminate di recente: foto selezionate {}{:.0} · clic destro → Ripristina, oppure Elimina definitivamente per importarle da capo",   "Already in the library: {} photo{} selected in All Photos": "Già nella libreria (selezionate in Tutte le foto): {}{:.0}",   "Auto ({})": "Automatico ({})",   "Auto Import: added {} photo{}": "Importazione automatica · foto aggiunte: {}{:.0}",@@ -70,7 +70,7 @@   "Imported {n} point curve preset{}": "Preset di curva a punti importati: {n}{:.0}",   "Imported {n} preset{}": "Preset importati: {n}{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "Preset importati: {n}{:.0}, file illeggibili: {f}{:.0}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Profili importati: {profiles}{:.0} (Browser dei profili → i loro gruppi)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Profili importati: {profiles}{:.0} (Browser dei profili → i loro gruppi)",   "Imported {} photo{}": "Foto importate: {}{:.0}",   "Insert at the cursor (also written {})": "Inserisci al cursore (si scrive anche {})",   "Label Set: {name}": "Set di etichette: {name}",@@ -192,7 +192,7 @@   "… and {more} more": "… e altre {more}",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft non sa ancora decodificare questa variante raw ({}). Stai modificando l'anteprima JPEG incorporata dalla fotocamera, che contiene già lo stile immagine della fotocamera (ad es. Monocromatico) e il bilanciamento del bianco.",   "Filtered: {label}": "Filtrate: {label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "Foto simili: {n}{:.0} · Visualizza → Cancella filtri per vederle tutte",+  "{n} similar photo{} · View → Clear Filters to see all": "Foto simili: {n}{:.0} · Visualizza → Cancella filtri per vederle tutte",   "Moved; {} photo(s) relinked": "Spostata; foto ricollegate: {}",   "{} label (click more labels to show any of them)": "Etichetta {} (fai clic su altre etichette per mostrarne una qualsiasi)",   ", {} star{}": ", stelle: {}{:.0}",@@ -264,7 +264,7 @@   "Keywords of {n} selected photos": "Parole chiave delle foto selezionate: {n}",   "new, inside {parent}": "nuova, dentro {parent}",   "Delete these {n} effect presets?": "Eliminare questi preset effetto ({n})?",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Imported {e} mask effect{} (Masking → Effect)",+  "Imported {e} mask effect{} (Masking → Effect)": "Imported {e} mask effect{} (Masking → Effect)",   "{photos} catalog records processed; {collections} collections.": "Record del catalogo elaborati: {photos}; raccolte: {collections}.",   "Skipped {problem}": "Saltato: {problem}",   "Updated {name}": "{name} aggiornato",@@ -282,7 +282,7 @@   " · kept, not applied: {}": " · conservato, non applicato: {}",   "Delete the effect preset “{name}”?": "Eliminare il preset effetto “{name}”?",   "{n} raws can now be developed from their raw data": "Raw che ora si possono sviluppare dai loro dati raw: {n}",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "Removed “{name}” from {n} photos. Edit → Undo puts it back.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "Removed “{name}” from {n} photos. Edit → Undo puts it back.",   "Inside: {names}": "Al suo interno: {names}",   "Template preview: {name}": "Anteprima del modello: {name}",   "{n} photos in view · {slides} slides · {time}": "Foto nella vista: {n} · diapositive: {slides} · {time}",diff --git a/crates/ui-egui/locales/it.json b/crates/ui-egui/locales/it.json--- a/crates/ui-egui/locales/it.json+++ b/crates/ui-egui/locales/it.json@@ -1191,7 +1191,7 @@   "Remove from survey": "Rimuovi dalla panoramica",   "Remove location info": "Rimuovi le informazioni sulla posizione",   "Remove shortcut": "Rimuovi scorciatoia",-  "Remove this face box (undo with Edit ▸ Undo)": "Rimuovi questo riquadro del volto (annulla con Modifica → Annulla)",+  "Remove this face box (undo with Edit → Undo)": "Rimuovi questo riquadro del volto (annulla con Modifica → Annulla)",   "Remove this filter": "Rimuovi questo filtro",   "Remove this group": "Rimuovi questo gruppo",   "Remove this rule": "Rimuovi questa regola",@@ -1228,7 +1228,7 @@   "Reset all curves: point curves (all channels) and parametric (double-click a channel to reset only that one)": "Reimposta tutte le curve: curve a punti (tutti i canali) e parametrica (doppio clic su un canale per reimpostare solo quello)",   "Reset all edits": "Ripristina tutte le modifiche",   "Reset all edits (Cmd+Shift+R)": "Reimposta tutte le modifiche (Cmd+Maiusc+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Gli album smart si aggiornano da soli: cambia le loro regole, oppure usa Foto → Elimina foto",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Gli album smart si aggiornano da soli: cambia le loro regole, oppure usa Foto → Elimina foto",   "LightCraft stopped": "LightCraft si è chiuso",   "Zoom to Focus Point": "Zoom sul punto di messa a fuoco",   "Focus": "Messa a fuoco",@@ -1266,7 +1266,7 @@   "Revert": "Ripristina",   "Review": "Revisione",   "Review Import": "Rivedi importazione",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Clic destro su una foto → Imposta come foto di riferimento, poi Visualizza → Vista di riferimento (Maiusc+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Clic destro su una foto → Imposta come foto di riferimento, poi Visualizza → Vista di riferimento (Maiusc+R)",   "Right-click a preset to delete it": "Clic destro su un preset per eliminarlo",   "Rights Usage Terms": "Condizioni d'uso dei diritti",   "Rotate": "Ruota",@@ -1838,7 +1838,7 @@   "Monitor profile": "Profilo monitor",   "None (the display is treated as sRGB)": "Nessuno (lo schermo viene trattato come sRGB)",   "Other editor": "Altro editor",-  "Photo ▸ Edit In ▸ Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Foto → Modifica in → Modifica in PhotoCraft (⇧⌘E, o clic destro su una foto) esegue il rendering di una copia con le tue modifiche, la impila con l'originale e la apre in PhotoCraft. Salva lì e la copia si aggiorna qui. Come PSD, PhotoCraft salva direttamente su di essa. Lascia vuota la posizione a meno che tu non usi una copia portatile.",+  "Photo → Edit In → Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Foto → Modifica in → Modifica in PhotoCraft (⇧⌘E, o clic destro su una foto) esegue il rendering di una copia con le tue modifiche, la impila con l'originale e la apre in PhotoCraft. Salva lì e la copia si aggiorna qui. Come PSD, PhotoCraft salva direttamente su di essa. Lascia vuota la posizione a meno che tu non usi una copia portatile.",   "PhotoCraft": "PhotoCraft",   "Photos are shown through your monitor's ICC profile, so colours are right on wide-gamut and calibrated displays, and the Detail view uses the display's whole gamut. The histogram, the preview caches and exports are not affected.": "Le foto vengono mostrate attraverso il profilo ICC del monitor, così i colori sono corretti su schermi calibrati e a gamut esteso, e la vista Dettaglio usa tutto il gamut dello schermo. Istogramma, cache delle anteprime ed esportazioni non cambiano.",   "Photos stay in All Photos. Deleting a folder also deletes its albums. You can undo this.": "Le foto restano in Tutte le foto. Eliminando una cartella si eliminano anche i suoi album. Puoi annullare l'operazione.",diff --git a/crates/ui-egui/locales/ja-formats.json b/crates/ui-egui/locales/ja-formats.json--- a/crates/ui-egui/locales/ja-formats.json+++ b/crates/ui-egui/locales/ja-formats.json@@ -120,7 +120,7 @@   "Adding photos… {} of {}": "写真を追加中:{1}枚中{0}枚",   " ({} in Recently Deleted)": "(うち{}枚は最近削除した写真)",   "Already in the library: {} photo{} selected in All Photos": "ライブラリに登録済み:すべての写真で{}枚を選択しました{:.0}",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "ライブラリの「最近削除した写真」にあります:{}枚を選択しました{:.0}・右クリック → 復元、または完全に削除してから読み込み直し",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "ライブラリの「最近削除した写真」にあります:{}枚を選択しました{:.0}・右クリック → 復元、または完全に削除してから読み込み直し",   "Auto ({})": "自動 ({})",   "Build 1:1 Previews ({scope})": "1:1プレビューを作成({scope})",   "Build Smart Previews ({scope})": "スマートプレビューを作成({scope})",@@ -169,7 +169,7 @@   "Lightroom geometry for {path} was not preserved; Guided Upright saved transform is unsupported.": "{path} の Lightroom ジオメトリは保持されませんでした。ガイド付き Upright の保存された変換はサポートされていません。",   "Lightroom geometry for {path} was not preserved; saved Upright transform is unsupported.": "{path} の Lightroom ジオメトリは保持されませんでした。保存された Upright の変換はサポートされていません。",   "XMP adjustments were not imported for {path}: {fields}.": "{path} の XMP 調整は読み込まれませんでした:{fields}。",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "{profiles}個のプロファイルを読み込みました{:.0}(プロファイルブラウザー → 各グループ)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "{profiles}個のプロファイルを読み込みました{:.0}(プロファイルブラウザー → 各グループ)",   "Insert at the cursor (also written {})": "カーソル位置に挿入({}とも表記可)",   "MIT OR Apache-2.0. Fonts: {} (OFL). Icons: original.": "MIT OR Apache-2.0。フォント:{}(OFL)。アイコン:オリジナル",   "Painting “{k}”: click photos to add or remove it · Esc stops": "「{k}」を適用中:写真をクリックして付け外し・Escで終了",@@ -199,7 +199,7 @@   "{} — show their photos": "{} — この人物の写真を表示",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraftはこのRAWの形式({})をまだデコードできません。カメラの埋め込みJPEGプレビューを編集しています。このプレビューには、カメラのピクチャースタイル(モノクロなど)とホワイトバランスがすでに反映されています",   "Filtered: {label}": "フィルター適用中:{label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "似た写真{n}枚{:.0}・すべて表示するには「表示 → フィルターを解除」",+  "{n} similar photo{} · View → Clear Filters to see all": "似た写真{n}枚{:.0}・すべて表示するには「表示 → フィルターを解除」",   "Moved; {} photo(s) relinked": "移動しました。{}枚の写真の参照先を更新しました",   "{} label (click more labels to show any of them)": "{}ラベル(ほかのラベルもクリックすると、いずれかに一致する写真を表示)",   ", {} star{}": "、星{}つ{:.0}",@@ -246,7 +246,7 @@   "Create the keyword “{name}”": "キーワード「{name}」を作成",   "new, inside {parent}": "新規、{parent} の中",   "Keywords of {n} selected photos": "選択した写真{n}枚のキーワード",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "「{name}」を写真{n}枚から削除しました。「編集」→「取り消す」で元に戻せます。",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "「{name}」を写真{n}枚から削除しました。「編集」→「取り消す」で元に戻せます。",   "1 task is still running: {names}. Quitting stops it.": "1件のタスクが実行中です:{names}。終了すると停止します。",   "{n} tasks are still running: {names}. Quitting stops them.": "{n}件のタスクが実行中です:{names}。終了すると停止します。",   "{what} merge cancelled": "{what}合成をキャンセルしました",@@ -266,7 +266,7 @@   "Delete {n} effect preset{}? This can't be undone.": "効果プリセット{n}件を削除しますか?{:.0}元に戻せません。",   "Effect: {name}": "効果:{name}",   "Exported {} effect preset{}": "効果プリセットを{}件書き出しました{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "マスク効果を{e}件読み込みました{:.0}(マスク → 効果)",+  "Imported {e} mask effect{} (Masking → Effect)": "マスク効果を{e}件読み込みました{:.0}(マスク → 効果)",   "Update “{name}” with Current Settings": "「{name}」を現在の設定で更新",   "{n} preset{}": "{n}件のプリセット{:.0}",   "{name} opened in the other editor": "{name}を別のエディタで開きました",diff --git a/crates/ui-egui/locales/ja.json b/crates/ui-egui/locales/ja.json--- a/crates/ui-egui/locales/ja.json+++ b/crates/ui-egui/locales/ja.json@@ -720,7 +720,7 @@   "Remove a filter above, or choose Clear all": "上のフィルターを解除するか、「すべて解除」を選択してください",   "Remove from Target Album": "追加先アルバムから除去",   "Remove shortcut": "ショートカットを削除",-  "Remove this face box (undo with Edit ▸ Undo)": "この顔の枠を除去(「編集 → 取り消す」で元に戻せます)",+  "Remove this face box (undo with Edit → Undo)": "この顔の枠を除去(「編集 → 取り消す」で元に戻せます)",   "Rename Component": "構成要素の名前を変更",   "Rename Folder": "フォルダ名を変更",   "Rename Mask": "マスク名を変更",@@ -1180,7 +1180,7 @@   "Reverse the order": "逆順にする",   "Review": "レビュー",   "Review Import": "読み込み内容を確認",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "写真を右クリックして参照写真に設定し、「表示 → 参照表示」(⇧R)を選択してください",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "写真を右クリックして参照写真に設定し、「表示 → 参照表示」(⇧R)を選択してください",   "Right-click a preset to delete it": "プリセットを右クリックして削除",   "Rights Usage Terms": "利用条件",   "Rotate": "回転",@@ -2314,7 +2314,7 @@   "Same folder as original photo": "元の写真と同じフォルダー",   "Tidying the thumbnail cache": "サムネールキャッシュを整理中",   "Reset all edits (Cmd+Shift+R)": "すべての編集をリセット(⌘⇧R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "スマートアルバムは自動で更新されます。ルールを変更するか、写真 → 写真を削除を使ってください",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "スマートアルバムは自動で更新されます。ルールを変更するか、写真 → 写真を削除を使ってください",   "LightCraft stopped": "LightCraftが終了しました",   "Focus Point": "フォーカスポイント",   "Zoom to Focus Point": "フォーカスポイントにズーム",diff --git a/crates/ui-egui/locales/ka-formats.json b/crates/ui-egui/locales/ka-formats.json--- a/crates/ui-egui/locales/ka-formats.json+++ b/crates/ui-egui/locales/ka-formats.json@@ -35,7 +35,7 @@   "Added “{keyword}” to {n} photo{}": "„{keyword}“ დაემატა ფოტოს: {n}{:.0}",   "Adding photos… {} of {}": "ფოტოების დამატება… {} / {}",   "All {n} selected photos move by the same amount.": "მონიშნული ფოტოები ({n}) ერთი და იმავე სიდიდით გადაინაცვლებს.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "უკვე ბიბლიოთეკაშია, ახლახან წაშლილებში: მონიშნულია ფოტო: {}{:.0} · მარჯვენა დაწკაპუნება → აღდგენა, ან სამუდამოდ წაშლა თავიდან იმპორტისთვის",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "უკვე ბიბლიოთეკაშია, ახლახან წაშლილებში: მონიშნულია ფოტო: {}{:.0} · მარჯვენა დაწკაპუნება → აღდგენა, ან სამუდამოდ წაშლა თავიდან იმპორტისთვის",   "Already in the library: {} photo{} selected in All Photos": "უკვე ბიბლიოთეკაშია: „ყველა ფოტოში“ მონიშნულია ფოტო: {}{:.0}",   "Auto ({})": "ავტომატური ({})",   "Auto Import: added {} photo{}": "ავტოიმპორტი: დაემატა ფოტო: {}{:.0}",@@ -80,7 +80,7 @@   "Imported {n} point curve preset{}": "იმპორტირებულია წერტილოვანი მრუდის პრესეტი: {n}{:.0}",   "Imported {n} preset{}": "იმპორტირებულია პრესეტი: {n}{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "იმპორტირებულია პრესეტი: {n}{:.0}, ვერ იკითხება ფაილი: {f}{:.0}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "იმპორტირებულია პროფილი: {profiles}{:.0} (პროფილების ბრაუზერი → მათი ჯგუფები)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "იმპორტირებულია პროფილი: {profiles}{:.0} (პროფილების ბრაუზერი → მათი ჯგუფები)",   "Imported {} photo{}": "იმპორტირებულია ფოტო: {}{:.0}",   "In line for AI Denoise ({ahead} ahead)…": "AI ხმაურის მოცილების რიგში (წინ არის: {ahead})…",   "Insert at the cursor (also written {})": "კურსორის ადგილას ჩასმა (ასევე იწერება როგორც {})",@@ -205,7 +205,7 @@   "{n} photo{}": "ფოტო: {n}{:.0}",   "{n} photo{} match · updates automatically as photos change": "შესაბამისი ფოტო: {n}{:.0} · ავტომატურად განახლდება ფოტოების ცვლილებისას",   "{n} photo{} now · updates automatically as photos change": "ახლა ფოტო: {n}{:.0} · ავტომატურად განახლდება ფოტოების ცვლილებისას",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "მსგავსი ფოტო: {n}{:.0} · ყველას სანახავად: ხედი → ფილტრების გასუფთავება",+  "{n} similar photo{} · View → Clear Filters to see all": "მსგავსი ფოტო: {n}{:.0} · ყველას სანახავად: ხედი → ფილტრების გასუფთავება",   "{n} tasks are still running: {names}. Quitting stops them.": "ჯერ კიდევ მიმდინარეობს ამოცანები ({n}): {names}. გასვლა მათ შეწყვეტს.",   "{n} {noun}": "{noun}: {n}",   "{pct} %": "{pct} %",@@ -262,12 +262,12 @@   "Effect: {name}": "Effect: {name}",   "Exported to {path}": "Exported to {path}",   "Exported {} effect preset{}": "Exported {} effect preset{}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Imported {e} mask effect{} (Masking → Effect)",+  "Imported {e} mask effect{} (Masking → Effect)": "Imported {e} mask effect{} (Masking → Effect)",   "Imported {name}": "Imported {name}",   "Keywords of {n} selected photos": "Keywords of {n} selected photos",   "LightCraft stopped unexpectedly: {e}": "LightCraft stopped unexpectedly: {e}",   "LightCraft stopped unexpectedly: {e}\n\nThe log file has the details: {path}": "LightCraft stopped unexpectedly: {e}\n\nThe log file has the details: {path}",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "Removed “{name}” from {n} photos. Edit → Undo puts it back.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "Removed “{name}” from {n} photos. Edit → Undo puts it back.",   "Inside: {names}": "შიგნით: {names}",   "Renames {n} face{} across the library. The files are not changed.": "Renames {n} face{} across the library. The files are not changed.",   "Saved template {name}": "Saved template {name}",diff --git a/crates/ui-egui/locales/ka.json b/crates/ui-egui/locales/ka.json--- a/crates/ui-egui/locales/ka.json+++ b/crates/ui-egui/locales/ka.json@@ -1484,7 +1484,7 @@   "Photo Merge": "ფოტოების გაერთიანება",   "Photo Merge of Canon CR2 (and other raws whose colour LightCraft fits from the camera's own JPEG, such as NEF and": "Canon CR2-ის (და სხვა RAW ფაილების, რომელთა ფერსაც LightCraft კამერის საკუთარი JPEG-იდან არგებს, როგორიცაა NEF და",   "Photo menu. The filmstrip has the photo context menu too. Adding a file again that is in Recently Deleted no": "„ფოტო“ მენიუში. კადრების ზოლსაც აქვს ფოტოს კონტექსტური მენიუ. ახლახან წაშლილში მყოფი ფაილის ხელახლა დამატება აღარ",-  "Photo ▸ Edit In ▸ Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "ფოტო → რედაქტირება სხვა პროგრამაში → რედაქტირება PhotoCraft-ში (⇧⌘E, ან მარჯვენა დაწკაპუნება ფოტოზე) არენდერებს ასლს თქვენი ცვლილებებით, ორიგინალთან ერთ დასტაში აერთიანებს და PhotoCraft-ში ხსნის. იქ შენახვისას ასლი აქაც განახლდება. PSD-ის შემთხვევაში PhotoCraft პირდაპირ მასში ინახავს. მდებარეობა ცარიელი დატოვეთ, თუ პორტატულ ასლს არ იყენებთ.",+  "Photo → Edit In → Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "ფოტო → რედაქტირება სხვა პროგრამაში → რედაქტირება PhotoCraft-ში (⇧⌘E, ან მარჯვენა დაწკაპუნება ფოტოზე) არენდერებს ასლს თქვენი ცვლილებებით, ორიგინალთან ერთ დასტაში აერთიანებს და PhotoCraft-ში ხსნის. იქ შენახვისას ასლი აქაც განახლდება. PSD-ის შემთხვევაში PhotoCraft პირდაპირ მასში ინახავს. მდებარეობა ცარიელი დატოვეთ, თუ პორტატულ ასლს არ იყენებთ.",   "Photo ▸ Edit in External Editor (⇧⌘E) renders a 16-bit TIFF copy, stacks it with the original and opens it here (an app name on macOS, a program path elsewhere).": "ფოტო → რედაქტირება გარე რედაქტორში (⇧⌘E) ქმნის 16-ბიტიან TIFF ასლს, ორიგინალთან ერთად დასტაში აერთიანებს და აქ ხსნის (macOS-ზე აპის სახელი, სხვაგან — პროგრამის მისამართი).",   "Photos": "ფოტოები",   "Photos are shown through your monitor's ICC profile, so colours are right on wide-gamut and calibrated displays, and the Detail view uses the display's whole gamut. The histogram, the preview caches and exports are not affected.": "ფოტოები თქვენი მონიტორის ICC პროფილით ნაჩვენებია, ამიტომ ფერები სწორია ფართო ფერთა გამისა და დაკალიბრებულ ეკრანებზე, ხოლო დეტალური ხედი ეკრანის მთელ ფერთა გამას იყენებს. ჰისტოგრამაზე, წინასწარი ხედების ქეშებსა და ექსპორტზე ეს გავლენას არ ახდენს.",@@ -1689,7 +1689,7 @@   "Remove location info": "მდებარეობის ინფორმაციის წაშლა",   "Remove missing photos from the library": "დაკარგული ფოტოების ბიბლიოთეკიდან ამოშლა",   "Remove shortcut": "მალსახმობის წაშლა",-  "Remove this face box (undo with Edit ▸ Undo)": "ამ სახის ჩარჩოს წაშლა (დაბრუნება: რედაქტირება → დაბრუნება)",+  "Remove this face box (undo with Edit → Undo)": "ამ სახის ჩარჩოს წაშლა (დაბრუნება: რედაქტირება → დაბრუნება)",   "Remove this filter": "ამ ფილტრის მოშორება",   "Remove this group": "ამ ჯგუფის წაშლა",   "Remove this rule": "ამ წესის წაშლა",@@ -1754,7 +1754,7 @@   "Right-click a folder (or a disk other than the startup disk) in the sidebar's Folders section ▸ Synchronize": "მარჯვენა დაწკაპუნება საქაღალდეზე (ან სასტარტოს გარდა სხვა დისკზე) გვერდითი ზოლის საქაღალდეების სექციაში → საქაღალდის",   "Right-click a folder ▸ New ▸ Create Album… / Create Smart Album… / Create Smart Album from Filter… / Create Folder…": "მარჯვენა დაწკაპუნება საქაღალდეზე → ახალი → ალბომის შექმნა… / სმარტ-ალბომის შექმნა… / სმარტ-ალბომის შექმნა ფილტრიდან… / საქაღალდის შექმნა…",   "Right-click a photo ▸ Edit In ▸ Edit in PhotoCraft (or Photo ▸ Edit In, ⇧⌘E) renders a copy with your edits, stacks it": "მარჯვენა დაწკაპუნება ფოტოზე → რედაქტირება სხვა პროგრამაში → რედაქტირება PhotoCraft-ში (ან ფოტო → რედაქტირება სხვა პროგრამაში, ⇧⌘E) არენდერებს ასლს თქვენი ცვლილებებით, ათავსებს მას",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "დაწკაპეთ ფოტოზე მარჯვენა ღილაკით → ეტალონურ ფოტოდ დაყენება, შემდეგ ხედი → ეტალონური ხედი (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "დაწკაპეთ ფოტოზე მარჯვენა ღილაკით → ეტალონურ ფოტოდ დაყენება, შემდეგ ხედი → ეტალონური ხედი (Shift+R)",   "Right-click a preset to delete it": "პრესეტის წასაშლელად დაწკაპეთ მასზე მარჯვენა ღილაკით",   "Right-click ▸ Put New Keywords Inside This Keyword: new keywords, made with + or typed in the box above, go inside": "მარჯვენა დაწკაპუნება → ახალი საკვანძო სიტყვების ამ საკვანძო სიტყვაში ჩასმა: + ღილაკით ან ზემოთ ველში აკრეფილი ახალი საკვანძო სიტყვები",   "Rights Usage Terms": "უფლებების გამოყენების პირობები",diff --git a/crates/ui-egui/locales/pl-formats.json b/crates/ui-egui/locales/pl-formats.json--- a/crates/ui-egui/locales/pl-formats.json+++ b/crates/ui-egui/locales/pl-formats.json@@ -25,7 +25,7 @@   "Added {what} to {name}": "Dodano {what} do {name}",   "Adding photos… {} of {}": "Dodawanie zdjęć… {} z {}",   "All {n} selected photos move by the same amount.": "Wszystkie {n} zaznaczone zdjęcia zostaną przesunięte o tę samą wartość.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Już w bibliotece, w Ostatnio usuniętych — zaznaczone zdjęcia: {}{:.0} · kliknij prawym przyciskiem → Przywróć albo Usuń trwale, aby zaimportować ponownie",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Już w bibliotece, w Ostatnio usuniętych — zaznaczone zdjęcia: {}{:.0} · kliknij prawym przyciskiem → Przywróć albo Usuń trwale, aby zaimportować ponownie",   "Already in the library: {} photo{} selected in All Photos": "Już w bibliotece — zaznaczone zdjęcia we Wszystkich zdjęciach: {}{:.0}",   "Auto ({})": "Automatycznie ({})",   "Auto Import: added {} photo{}": "Automatyczny import — dodane zdjęcia: {}{:.0}",@@ -63,7 +63,7 @@   "Imported {n} point curve preset{}": "Zaimportowane ustawienia krzywej punktowej: {n}{:.0}",   "Imported {n} preset{}": "Zaimportowane ustawienia wstępne: {n}{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "Zaimportowane ustawienia wstępne: {n}{:.0}, nieczytelne pliki: {f}{:.0}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Zaimportowane profile: {profiles}{:.0} (Przeglądarka profili → odpowiednie grupy)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Zaimportowane profile: {profiles}{:.0} (Przeglądarka profili → odpowiednie grupy)",   "Imported {} photo{}": "Zaimportowane zdjęcia: {}{:.0}",   "Insert at the cursor (also written {})": "Wstaw w miejscu kursora (zostanie też zapisane {})",   "Label Set: {name}": "Zestaw etykiet: {name}",@@ -183,7 +183,7 @@   "… and {more} more": "… i jeszcze {more}",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft nie obsługuje jeszcze tego wariantu RAW ({}). Edytujesz podgląd JPEG osadzony przez aparat, zawierający już styl obrazu aparatu (np. monochromatyczny) i balans bieli.",   "Filtered: {label}": "Filtrowanie: {label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "Podobne zdjęcia: {n}{:.0} · Widok → Wyczyść filtry, aby zobaczyć wszystkie",+  "{n} similar photo{} · View → Clear Filters to see all": "Podobne zdjęcia: {n}{:.0} · Widok → Wyczyść filtry, aby zobaczyć wszystkie",   "Moved; {} photo(s) relinked": "Przeniesiono; ponownie powiązane zdjęcia: {}",   "{} label (click more labels to show any of them)": "{} etykieta (kliknij kolejne etykiety, aby wyświetlić dowolną z nich)",   ", {} star{}": ", gwiazdki: {}{:.0}",@@ -257,7 +257,7 @@   "Delete {n} effect preset{}? This can't be undone.": "Usunąć ustawienia efektów ({n})?{:.0} Tej operacji nie można cofnąć.",   "Effect: {name}": "Efekt: {name}",   "Exported {} effect preset{}": "Wyeksportowane ustawienia efektów: {}{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Zaimportowane efekty masek: {e}{:.0} (Maskowanie → Efekt)",+  "Imported {e} mask effect{} (Masking → Effect)": "Zaimportowane efekty masek: {e}{:.0} (Maskowanie → Efekt)",   "Update “{name}” with Current Settings": "Zaktualizuj „{name}” bieżącymi ustawieniami",   "{n} preset{}": "Ustawienia: {n}{:.0}",   "{count} more warnings.": "Pozostałe ostrzeżenia: {count}.",@@ -284,7 +284,7 @@   "Create the keyword “{name}”": "Utwórz słowo kluczowe „{name}”",   "new, inside {parent}": "nowe, w {parent}",   "Keywords of {n} selected photos": "Słowa kluczowe zaznaczonych zdjęć ({n})",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "Usunięto „{name}” ze zdjęć ({n}). Edytuj → Cofnij przywraca.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "Usunięto „{name}” ze zdjęć ({n}). Edytuj → Cofnij przywraca.",   "LightCraft stopped unexpectedly: {e}\n\nThe log file has the details: {path}": "LightCraft nieoczekiwanie zakończył działanie: {e}\n\nSzczegóły są w pliku dziennika: {path}",   "LightCraft stopped unexpectedly: {e}": "LightCraft nieoczekiwanie zakończył działanie: {e}",   "Renames {n} face{} across the library. The files are not changed.": "Zmienia nazwę twarzy w całej bibliotece (twarze: {n}).{:.0} Pliki nie są zmieniane.",diff --git a/crates/ui-egui/locales/pl.json b/crates/ui-egui/locales/pl.json--- a/crates/ui-egui/locales/pl.json+++ b/crates/ui-egui/locales/pl.json@@ -1152,7 +1152,7 @@   "Remove from survey": "Usuń z widoku przeglądu",   "Remove location info": "Usuń informacje o lokalizacji",   "Remove shortcut": "Usuń skrót klawiszowy",-  "Remove this face box (undo with Edit ▸ Undo)": "Usuń tę ramkę twarzy (cofnij przez Edycja → Cofnij)",+  "Remove this face box (undo with Edit → Undo)": "Usuń tę ramkę twarzy (cofnij przez Edycja → Cofnij)",   "Remove this filter": "Usuń ten filtr",   "Remove this group": "Usuń tę grupę",   "Remove this rule": "Usuń tę regułę",@@ -1205,7 +1205,7 @@   "Revert": "Cofnij zmiany",   "Review": "Przegląd",   "Review Import": "Sprawdź import",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Kliknij zdjęcie prawym przyciskiem → Ustaw jako zdjęcie referencyjne, a potem Widok → Widok referencyjny (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Kliknij zdjęcie prawym przyciskiem → Ustaw jako zdjęcie referencyjne, a potem Widok → Widok referencyjny (Shift+R)",   "Right-click a preset to delete it": "Kliknij ustawienie wstępne prawym przyciskiem, aby je usunąć",   "Rights Usage Terms": "Warunki korzystania z praw",   "Rotate": "Obróć",diff --git a/crates/ui-egui/locales/pt-br-formats.json b/crates/ui-egui/locales/pt-br-formats.json--- a/crates/ui-egui/locales/pt-br-formats.json+++ b/crates/ui-egui/locales/pt-br-formats.json@@ -15,7 +15,7 @@   "Added {n} photo{} to “{}”": "{n} foto{0} adicionada{0} a “{1}”",   "Adding photos… {} of {}": "Adicionando fotos… {} de {}",   "All {n} selected photos move by the same amount.": "Todas as {n} fotos selecionadas se movem pela mesma quantidade.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Já na biblioteca, em Excluídos recentemente: {0} foto{1} selecionada{1} · clique com o botão direito → Restaurar, ou Excluir permanentemente para importar de novo",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Já na biblioteca, em Excluídos recentemente: {0} foto{1} selecionada{1} · clique com o botão direito → Restaurar, ou Excluir permanentemente para importar de novo",   "Already in the library: {} photo{} selected in All Photos": "Já na biblioteca: {0} foto{1} selecionada{1} em Todas as fotos",   "Already in “{}”": "Já está em “{}”",   "Auto ({})": "Automático ({})",@@ -169,7 +169,7 @@   "Lightroom geometry for {path} was not preserved; Guided Upright saved transform is unsupported.": "A geometria do Lightroom não foi preservada para {path}; a transformação salva do Upright guiado não é compatível.",   "Lightroom geometry for {path} was not preserved; saved Upright transform is unsupported.": "A geometria do Lightroom não foi preservada para {path}; a transformação salva do Upright não é compatível.",   "XMP adjustments were not imported for {path}: {fields}.": "Os ajustes XMP não foram importados para {path}: {fields}.",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "{profiles} perfil(is) importado(s){:.0} (Navegador de perfis → seus grupos)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "{profiles} perfil(is) importado(s){:.0} (Navegador de perfis → seus grupos)",   "Insert at the cursor (also written {})": "Inserir no cursor (também escrito {})",   "MIT OR Apache-2.0. Fonts: {} (OFL). Icons: original.": "MIT OR Apache-2.0. Fontes: {} (OFL). Ícones: originais.",   "Painting “{k}”: click photos to add or remove it · Esc stops": "Aplicando “{k}”: clique nas fotos para adicionar ou remover · Esc para",@@ -199,7 +199,7 @@   "{} — show their photos": "{} — mostrar as fotos desta pessoa",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "O LightCraft ainda não consegue decodificar esta variante RAW ({}). Você está editando a prévia JPEG incorporada da câmera, que já inclui o estilo de imagem da câmera (p. ex. Monocromático) e o balanço de branco.",   "Filtered: {label}": "Filtrado: {label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "{n} foto{0} semelhante{0} · Exibir → Limpar filtros para ver todas",+  "{n} similar photo{} · View → Clear Filters to see all": "{n} foto{0} semelhante{0} · Exibir → Limpar filtros para ver todas",   "Moved; {} photo(s) relinked": "Movida; {} foto(s) vinculada(s) novamente",   "{} label (click more labels to show any of them)": "Rótulo {} (clique em mais rótulos para mostrar qualquer um deles)",   ", {} star{}": ", {} estrela{}",@@ -246,7 +246,7 @@   "Create the keyword “{name}”": "Criar a palavra-chave “{name}”",   "new, inside {parent}": "nova, dentro de {parent}",   "Keywords of {n} selected photos": "Palavras-chave de {n} fotos selecionadas",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "“{name}” removida de {n} fotos. Editar → Desfazer a traz de volta.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "“{name}” removida de {n} fotos. Editar → Desfazer a traz de volta.",   "1 task is still running: {names}. Quitting stops it.": "1 tarefa ainda está em andamento: {names}. Sair a interrompe.",   "{n} tasks are still running: {names}. Quitting stops them.": "{n} tarefas ainda estão em andamento: {names}. Sair as interrompe.",   "{what} merge cancelled": "{what} mesclagem cancelada",@@ -266,7 +266,7 @@   "Delete {n} effect preset{}? This can't be undone.": "Excluir {n} predefinição(ões) de efeito?{:.0} Não é possível desfazer.",   "Effect: {name}": "Efeito: {name}",   "Exported {} effect preset{}": "Predefinições de efeito exportadas: {}{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "{e} efeito(s) de máscara importado(s){:.0} (Máscaras → Efeito)",+  "Imported {e} mask effect{} (Masking → Effect)": "{e} efeito(s) de máscara importado(s){:.0} (Máscaras → Efeito)",   "Update “{name}” with Current Settings": "Atualizar “{name}” com as configurações atuais",   "{n} preset{}": "{n} predefinição(ões){:.0}",   "{name} opened in the other editor": "{name} aberto no outro editor",diff --git a/crates/ui-egui/locales/pt-br.json b/crates/ui-egui/locales/pt-br.json--- a/crates/ui-egui/locales/pt-br.json+++ b/crates/ui-egui/locales/pt-br.json@@ -1200,7 +1200,7 @@   "Remove from survey": "Remover da inspeção",   "Remove location info": "Remover informações de local",   "Remove shortcut": "Remover atalho",-  "Remove this face box (undo with Edit ▸ Undo)": "Remover esta caixa de rosto (desfaça com Editar → Desfazer)",+  "Remove this face box (undo with Edit → Undo)": "Remover esta caixa de rosto (desfaça com Editar → Desfazer)",   "Remove this filter": "Remover este filtro",   "Remove this group": "Remover este grupo",   "Remove this rule": "Remover esta regra",@@ -1253,7 +1253,7 @@   "Revert": "Reverter",   "Review": "Revisão",   "Review Import": "Revisar importação",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Clique com o botão direito em uma foto → Definir como foto de referência, depois Exibir → Exibição de referência (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Clique com o botão direito em uma foto → Definir como foto de referência, depois Exibir → Exibição de referência (Shift+R)",   "Right-click a preset to delete it": "Clique com o botão direito em uma predefinição para excluí-la",   "Rights Usage Terms": "Termos de uso dos direitos",   "Rotate": "Girar",@@ -2154,7 +2154,7 @@   "Same folder as original photo": "Mesma pasta da foto original",   "Tidying the thumbnail cache": "Organizando o cache de miniaturas",   "Reset all edits (Cmd+Shift+R)": "Redefinir todas as edições (Cmd+Shift+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Álbuns inteligentes se atualizam sozinhos: altere as regras ou use Foto → Excluir foto",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Álbuns inteligentes se atualizam sozinhos: altere as regras ou use Foto → Excluir foto",   "LightCraft stopped": "O LightCraft parou",   "Focus Point": "Ponto de foco",   "Zoom to Focus Point": "Zoom no ponto de foco",diff --git a/crates/ui-egui/locales/ru-formats.json b/crates/ui-egui/locales/ru-formats.json--- a/crates/ui-egui/locales/ru-formats.json+++ b/crates/ui-egui/locales/ru-formats.json@@ -27,7 +27,7 @@   "Added {what} to {name}": "{what}: добавлено в {name}",   "Adding photos… {} of {}": "Добавление фото… {} из {}",   "All {n} selected photos move by the same amount.": "Все выбранные фото ({n}) сдвигаются на одно и то же значение.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Уже в библиотеке, в «Недавно удалённых»: выбрано фото: {}{:.0} · щёлкните правой кнопкой → Восстановить или Удалить навсегда, чтобы импортировать заново",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Уже в библиотеке, в «Недавно удалённых»: выбрано фото: {}{:.0} · щёлкните правой кнопкой → Восстановить или Удалить навсегда, чтобы импортировать заново",   "Already in the library: {} photo{} selected in All Photos": "Уже в библиотеке: выбрано фото в разделе «Все фото»: {}{:.0}",   "Auto ({})": "Авто ({})",   "Auto Import: added {} photo{}": "Автоимпорт: добавлено фото: {}{:.0}",@@ -75,7 +75,7 @@   "Imported {n} point curve preset{}": "Импортировано пресетов точечной кривой: {n}{:.0}",   "Imported {n} preset{}": "Импортировано пресетов: {n}{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "Импортировано пресетов: {n}{:.0}, не читается файлов: {f}{:.0}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Импортировано профилей: {profiles}{:.0} (Обозреватель профилей → их группы)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Импортировано профилей: {profiles}{:.0} (Обозреватель профилей → их группы)",   "Imported {} photo{}": "Импортировано фото: {}{:.0}",   "Insert at the cursor (also written {})": "Вставить в позицию курсора (также пишется как {})",   "Label Set: {name}": "Набор меток: {name}",@@ -169,7 +169,7 @@   "{n} photo{} match · updates automatically as photos change": "Подходящих фото: {n}{:.0} · обновляется автоматически при изменении фото",   "{n} photo{} now · updates automatically as photos change": "Сейчас фото: {n}{:.0} · обновляется автоматически при изменении фото",   "{n} selected photos · {pages} pages": "Выбрано фото: {n} · страниц: {pages}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "Похожих фото: {n}{:.0} · Вид → Сбросить фильтры, чтобы увидеть все",+  "{n} similar photo{} · View → Clear Filters to see all": "Похожих фото: {n}{:.0} · Вид → Сбросить фильтры, чтобы увидеть все",   "{pid} (missing)": "{pid} (отсутствует)",   "{sel_n} selected · {counted}": "Выбрано: {sel_n} · {counted}",   "{stage}… {:.0}%": "{stage}… {:.0}%",@@ -242,7 +242,7 @@   "Create the keyword “{name}”": "Создать ключевое слово «{name}»",   "new, inside {parent}": "новое, внутри {parent}",   "Keywords of {n} selected photos": "Ключевые слова выбранных фото: {n}",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "«{name}» убрано с фото: {n}. Правка → Отменить вернёт его.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "«{name}» убрано с фото: {n}. Правка → Отменить вернёт его.",   "1 task is still running: {names}. Quitting stops it.": "Ещё выполняется задача: {names}. Выход прервёт её.",   "{n} tasks are still running: {names}. Quitting stops them.": "Ещё выполняется задач: {n} — {names}. Выход прервёт их.",   "{what} merge cancelled": "{what}: слияние отменено",@@ -262,7 +262,7 @@   "Delete {n} effect preset{}? This can't be undone.": "Удалить пресеты эффектов ({n})?{:.0} Это нельзя отменить.",   "Effect: {name}": "Эффект: {name}",   "Exported {} effect preset{}": "Экспортировано пресетов эффектов: {}{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Импортировано эффектов маски: {e}{:.0} (Маски → Эффект)",+  "Imported {e} mask effect{} (Masking → Effect)": "Импортировано эффектов маски: {e}{:.0} (Маски → Эффект)",   "Update “{name}” with Current Settings": "Обновить «{name}» текущими настройками",   "{n} preset{}": "Пресетов: {n}{:.0}",   "{name} opened in the other editor": "{name} открыт в другом редакторе",diff --git a/crates/ui-egui/locales/ru.json b/crates/ui-egui/locales/ru.json--- a/crates/ui-egui/locales/ru.json+++ b/crates/ui-egui/locales/ru.json@@ -1040,7 +1040,7 @@   "Retouch": "Ретушь",   "Revert": "Вернуть",   "Review Import": "Проверить импорт",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Щёлкните фото правой кнопкой → Назначить эталонным фото, затем Вид → Режим эталона (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Щёлкните фото правой кнопкой → Назначить эталонным фото, затем Вид → Режим эталона (Shift+R)",   "Right-click a preset to delete it": "Щёлкните пресет правой кнопкой, чтобы удалить его",   "Rights Usage Terms": "Условия использования прав",   "Rotate": "Повернуть",@@ -1975,7 +1975,7 @@   "Remove a filter above, or choose Clear all": "Уберите фильтр выше или выберите «Очистить всё»",   "Remove from Library…": "Убрать из библиотеки…",   "Remove from Target Album": "Убрать из целевого альбома",-  "Remove this face box (undo with Edit ▸ Undo)": "Удалить эту рамку лица (отмена: Правка → Отменить)",+  "Remove this face box (undo with Edit → Undo)": "Удалить эту рамку лица (отмена: Правка → Отменить)",   "Rename Component": "Переименовать компонент",   "Rename Folder… and Move Folder To… (Local) can be undone and redone (issue #97): the folder moves back on disk with": "Переименование папки… и перемещение папки в… («Локальное») можно отменить и повторить (проблема #97): папка возвращается на диске вместе с",   "Rename Photos never overwrites another photo when only the letter case changes (issue #95): on case-sensitive": "Переименование фото никогда не перезаписывает другое фото, когда меняется только регистр букв (проблема #95): на томах с учётом регистра",@@ -2307,7 +2307,7 @@   "Same folder as original photo": "Та же папка, что и у оригинала",   "Tidying the thumbnail cache": "Упорядочивание кэша миниатюр",   "Reset all edits (Cmd+Shift+R)": "Сбросить все правки (Cmd+Shift+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Смарт-альбомы обновляются сами: измените их правила или выберите Фото → Удалить фото",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Смарт-альбомы обновляются сами: измените их правила или выберите Фото → Удалить фото",   "LightCraft stopped": "LightCraft остановился",   "Focus Point": "Точка фокусировки",   "Zoom to Focus Point": "Увеличить по точке фокусировки",diff --git a/crates/ui-egui/locales/sv-formats.json b/crates/ui-egui/locales/sv-formats.json--- a/crates/ui-egui/locales/sv-formats.json+++ b/crates/ui-egui/locales/sv-formats.json@@ -39,7 +39,7 @@   "Added “{keyword}” to {n} photo{}": "Lade till ”{keyword}” på {n} foto{}",   "Adding photos… {} of {}": "Lägger till foton… {} av {}",   "All {n} selected photos move by the same amount.": "Alla {n} markerade foton flyttas lika mycket.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Finns redan i biblioteket, i Nyligen raderade: {} foto{} markerade · högerklicka → Återställ, eller Radera permanent för att importera på nytt",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Finns redan i biblioteket, i Nyligen raderade: {} foto{} markerade · högerklicka → Återställ, eller Radera permanent för att importera på nytt",   "Already in the library: {} photo{} selected in All Photos": "Finns redan i biblioteket: {} foto{} markerade i Alla foton",   "Applied {name}": "Tillämpade {name}",   "Apply to “{mask}” on Selected Photos": "Använd på ”{mask}” i markerade foton",@@ -91,12 +91,12 @@   "Import cancelled · {} photo{} added": "Importen avbröts · {} foto{} tillagda",   "Import failed: {e}": "Importen misslyckades: {e}",   "Import warnings ({n}):\n{warnings}": "Importvarningar ({n}):\n{warnings}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Importerade {e} maskeffekt{} (Maskering → Effekt)",+  "Imported {e} mask effect{} (Masking → Effect)": "Importerade {e} maskeffekt{} (Maskering → Effekt)",   "Imported {name}": "Importerade {name}",   "Imported {n} point curve preset{}": "Importerade {n} punktkurvförinställning{}",   "Imported {n} preset{}": "Importerade {n} förinställning{}",   "Imported {n} preset{}, {f} file{} not readable": "Importerade {n} förinställning{}, {f} fil{} kunde inte läsas",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Importerade {profiles} profil{} (Profilbläddrare → deras grupper)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Importerade {profiles} profil{} (Profilbläddrare → deras grupper)",   "Imported {} photo{}": "Importerade {} foto{}",   "In line for AI Denoise ({ahead} ahead)…": "I kö för AI-brusreducering ({ahead} före)…",   "Insert at the cursor (also written {})": "Infoga vid textmarkören (skrivs även {})",@@ -153,7 +153,7 @@   "Remove “{}” from Favorites": "Ta bort ”{}” från Favoriter",   "Removed from {}": "Borttaget från {}",   "Removed {what} from {name}": "Tog bort {what} från {name}",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "Tog bort ”{name}” från {n} foton. Redigera → Ångra lägger tillbaka det.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "Tog bort ”{name}” från {n} foton. Redigera → Ångra lägger tillbaka det.",   "Rename {n} Photos…": "Byt namn på {n} foton…",   "Rename “{name}”": "Byt namn på ”{name}”",   "Renames {n} face{} across the library. The files are not changed.": "Byter namn på {n} ansikte{} i hela biblioteket. Filerna ändras inte.",@@ -241,7 +241,7 @@   "{n} photo{} now · updates automatically as photos change": "{n} foto{} just nu · uppdateras automatiskt när fotona ändras",   "{n} preset{}": "{n} förinställning{}",   "{n} raws can now be developed from their raw data": "{n} raw-filer kan nu framkallas från sina rådata",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "{n} likartade foto{} · Visa → Rensa filter för att se alla",+  "{n} similar photo{} · View → Clear Filters to see all": "{n} likartade foto{} · Visa → Rensa filter för att se alla",   "{n} tasks are still running: {names}. Quitting stops them.": "{n} uppgifter körs fortfarande: {names}. Om du avslutar stoppas de.",   "{n} {noun}": "{n} {noun}",   "{pct} %": "{pct} %",diff --git a/crates/ui-egui/locales/sv.json b/crates/ui-egui/locales/sv.json--- a/crates/ui-egui/locales/sv.json+++ b/crates/ui-egui/locales/sv.json@@ -1546,7 +1546,7 @@   "Photo Merge": "Fotosammanfogning",   "photo waiting": "foto väntar",   "Photo ▸ Edit in External Editor (⇧⌘E) renders a 16-bit TIFF copy, stacks it with the original and opens it here (an app name on macOS, a program path elsewhere).": "Foto → Redigera i externt program (⇧⌘E) renderar en 16-bitars TIFF-kopia, staplar den med originalet och öppnar den här (ett appnamn på macOS, en programsökväg på andra system).",-  "Photo ▸ Edit In ▸ Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Foto → Redigera i → Redigera i PhotoCraft (⇧⌘E, eller högerklicka på ett foto) renderar en kopia med dina ändringar, staplar den med originalet och öppnar den i PhotoCraft. Spara där så uppdateras kopian här. Som PSD sparar PhotoCraft direkt tillbaka till den. Lämna platsen tom om du inte använder en portabel kopia.",+  "Photo → Edit In → Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Foto → Redigera i → Redigera i PhotoCraft (⇧⌘E, eller högerklicka på ett foto) renderar en kopia med dina ändringar, staplar den med originalet och öppnar den i PhotoCraft. Spara där så uppdateras kopian här. Som PSD sparar PhotoCraft direkt tillbaka till den. Lämna platsen tom om du inte använder en portabel kopia.",   "PhotoCraft": "PhotoCraft",   "Photos": "Foton",   "Photos are shown through your monitor's ICC profile, so colours are right on wide-gamut and calibrated displays, and the Detail view uses the display's whole gamut. The histogram, the preview caches and exports are not affected.": "Foton visas genom bildskärmens ICC-profil, så att färgerna blir rätt på kalibrerade skärmar och skärmar med brett färgomfång, och vyn Detalj använder skärmens hela färgomfång. Histogrammet, förhandsgranskningscacharna och exporter påverkas inte.",@@ -1757,7 +1757,7 @@   "Remove missing photos from the library": "Ta bort saknade foton från biblioteket",   "Remove region": "Ta bort region",   "Remove shortcut": "Ta bort kortkommando",-  "Remove this face box (undo with Edit ▸ Undo)": "Ta bort den här ansiktsrutan (ångra med Redigera → Ångra)",+  "Remove this face box (undo with Edit → Undo)": "Ta bort den här ansiktsrutan (ångra med Redigera → Ångra)",   "Remove this filter": "Ta bort det här filtret",   "Remove this group": "Ta bort den här gruppen",   "Remove this rule": "Ta bort den här regeln",@@ -1826,7 +1826,7 @@   "Review": "Granskning",   "Review Import": "Granska import",   "Right": "Höger",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Högerklicka på ett foto → Ange som referensfoto, sedan Visa → Referensvy (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Högerklicka på ett foto → Ange som referensfoto, sedan Visa → Referensvy (Shift+R)",   "Right-click a preset to delete it": "Högerklicka på en förinställning för att radera den",   "Rights Usage Terms": "Villkor för användningsrätt",   "Rotate": "Rotera",@@ -2044,7 +2044,7 @@   "Smart Album Rule Fields": "Regelfält för smarta album",   "smart album value|No": "Nej",   "smart album value|Yes": "Ja",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Smarta album uppdateras automatiskt: ändra deras regler eller använd Foto → Radera foto",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Smarta album uppdateras automatiskt: ändra deras regler eller använd Foto → Radera foto",   "Smart albums with a rule editor: match all / any / none, nested groups, 26 fields.": "Smarta album med regelredigerare: matcha alla/någon/ingen, nästlade grupper, 26 fält.",   "Smart preview available": "Smart förhandsgranskning tillgänglig",   "Smart Preview Status": "Status för smart förhandsgranskning",diff --git a/crates/ui-egui/locales/uk-formats.json b/crates/ui-egui/locales/uk-formats.json--- a/crates/ui-egui/locales/uk-formats.json+++ b/crates/ui-egui/locales/uk-formats.json@@ -25,7 +25,7 @@   "Added {what} to {name}": "{what}: додано до {name}",   "Adding photos… {} of {}": "Додавання фото… {} з {}",   "All {n} selected photos move by the same amount.": "Усі вибрані фото ({n}) зміщуються на однакове значення.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Уже в бібліотеці, у нещодавно видалених: вибрано фото: {}{:.0} · права кнопка → Відновити або Видалити назавжди, щоб імпортувати заново",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Уже в бібліотеці, у нещодавно видалених: вибрано фото: {}{:.0} · права кнопка → Відновити або Видалити назавжди, щоб імпортувати заново",   "Already in the library: {} photo{} selected in All Photos": "Уже в бібліотеці: вибрано фото в усіх фото: {}{:.0}",   "Auto ({})": "Автоматично ({})",   "Auto Import: added {} photo{}": "Автоімпорт: додано фото: {}{:.0}",@@ -65,7 +65,7 @@   "Imported {n} point curve preset{}": "Імпортовано наборів налаштувань точкової кривої: {n}{:.0}",   "Imported {n} preset{}": "Імпортовано наборів налаштувань: {n}{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "Імпортовано наборів налаштувань: {n}{:.0}, файлів не читається: {f}{:.0}",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Імпортовано профілів: {profiles}{:.0} (Оглядач профілів → їхні групи)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Імпортовано профілів: {profiles}{:.0} (Оглядач профілів → їхні групи)",   "The XMP sidecars of {n} photos couldn't be written (is their folder offline?). LightCraft keeps trying.": "Не вдалося записати XMP-файли {n} фото (папка недоступна?). LightCraft продовжує спроби.",   "XMP profile \"{profile}\" was not applied for {path}; colors may differ from Lightroom.": "Профіль XMP «{profile}» не застосовано до {path}; кольори можуть відрізнятися від Lightroom.",   "Lightroom geometry was not preserved for {path}; {mode} will be recalculated.": "Геометрію Lightroom для {path} не збережено; режим {mode} буде перераховано.",@@ -195,7 +195,7 @@   "… and {more} more": "… і ще {more}",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft ще не може декодувати цей варіант RAW ({}). Ви редагуєте вбудований JPEG-перегляд камери, який уже містить її стиль зображення (наприклад, монохромний) і баланс білого.",   "Filtered: {label}": "Відфільтровано: {label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "Подібних фото: {n}{:.0} · Вигляд → Скинути фільтри, щоб побачити всі",+  "{n} similar photo{} · View → Clear Filters to see all": "Подібних фото: {n}{:.0} · Вигляд → Скинути фільтри, щоб побачити всі",   "Moved; {} photo(s) relinked": "Переміщено; повторно пов’язано фото: {}",   "{} label (click more labels to show any of them)": "Мітка «{}» (клацніть інші мітки, щоб показати фото з будь-якою з них)",   ", {} star{}": ", зірок: {}{:.0}",@@ -242,7 +242,7 @@   "Create the keyword “{name}”": "Створити ключове слово «{name}»",   "new, inside {parent}": "нове, всередині {parent}",   "Keywords of {n} selected photos": "Ключові слова вибраних фото: {n}",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "«{name}» вилучено з фото: {n}. Редагування → Скасувати поверне його.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "«{name}» вилучено з фото: {n}. Редагування → Скасувати поверне його.",   "1 task is still running: {names}. Quitting stops it.": "1 завдання ще виконується: {names}. Вихід зупинить його.",   "{n} tasks are still running: {names}. Quitting stops them.": "Ще виконуються завдання ({n}): {names}. Вихід зупинить їх.",   "{what} merge cancelled": "Об’єднання {what} скасовано",@@ -262,7 +262,7 @@   "Delete {n} effect preset{}? This can't be undone.": "Видалити пресети ефектів ({n})?{:.0} Це не можна скасувати.",   "Effect: {name}": "Ефект: {name}",   "Exported {} effect preset{}": "Експортовано пресетів ефектів: {}{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Імпортовано ефектів маски: {e}{:.0} (Маски → Ефект)",+  "Imported {e} mask effect{} (Masking → Effect)": "Імпортовано ефектів маски: {e}{:.0} (Маски → Ефект)",   "Update “{name}” with Current Settings": "Оновити «{name}» поточними налаштуваннями",   "{n} preset{}": "Пресетів: {n}{:.0}",   "{name} opened in the other editor": "{name} відкрито в іншому редакторі",diff --git a/crates/ui-egui/locales/uk.json b/crates/ui-egui/locales/uk.json--- a/crates/ui-egui/locales/uk.json+++ b/crates/ui-egui/locales/uk.json@@ -930,7 +930,7 @@   "Remove a filter above, or choose Clear all": "Видаліть фільтр вище або виберіть «Очистити все»",   "Remove from Target Album": "Вилучити з цільового альбому",   "Remove shortcut": "Видалити скорочення",-  "Remove this face box (undo with Edit ▸ Undo)": "Видалити цю рамку обличчя (скасувати через Редагування → Скасувати)",+  "Remove this face box (undo with Edit → Undo)": "Видалити цю рамку обличчя (скасувати через Редагування → Скасувати)",   "Rename Component": "Перейменувати компонент",   "Rename Folder": "Перейменувати теку",   "Rename Mask": "Перейменувати маску",@@ -1273,7 +1273,7 @@   "Restore them": "Відновити їх",   "Retouch": "Ретушування",   "Review Import": "Перевірити імпорт",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Клацніть фото правою кнопкою → Задати як еталонне фото, потім Вигляд → Еталонне подання (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Клацніть фото правою кнопкою → Задати як еталонне фото, потім Вигляд → Еталонне подання (Shift+R)",   "Right-click a preset to delete it": "Клацніть набір налаштувань правою кнопкою, щоб видалити його",   "Rights Usage Terms": "Умови використання прав",   "Rotate Crop": "Обертати кадрування",@@ -2312,7 +2312,7 @@   "Same folder as original photo": "Та сама папка, що й оригінал",   "Tidying the thumbnail cache": "Упорядкування кешу мініатюр",   "Reset all edits (Cmd+Shift+R)": "Скинути всі зміни (Cmd+Shift+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "Розумні альбоми оновлюються самі: змініть їхні правила або виберіть Фото → Видалити фото",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "Розумні альбоми оновлюються самі: змініть їхні правила або виберіть Фото → Видалити фото",   "LightCraft stopped": "LightCraft зупинився",   "Focus Point": "Точка фокусування",   "Zoom to Focus Point": "Збільшити до точки фокусування",diff --git a/crates/ui-egui/locales/vi-formats.json b/crates/ui-egui/locales/vi-formats.json--- a/crates/ui-egui/locales/vi-formats.json+++ b/crates/ui-egui/locales/vi-formats.json@@ -39,7 +39,7 @@   "Added “{keyword}” to {n} photo{}": "Đã thêm «{keyword}» vào {n} ảnh{:.0}",   "Adding photos… {} of {}": "Đang thêm ảnh… {} / {}",   "All {n} selected photos move by the same amount.": "Tất cả {n} ảnh đã chọn dịch chuyển cùng một lượng.",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "Đã có trong thư viện, trong Đã xóa gần đây: đã chọn {} ảnh{:.0} · nhấp chuột phải → Khôi phục, hoặc Xóa vĩnh viễn để nhập lại",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "Đã có trong thư viện, trong Đã xóa gần đây: đã chọn {} ảnh{:.0} · nhấp chuột phải → Khôi phục, hoặc Xóa vĩnh viễn để nhập lại",   "Already in the library: {} photo{} selected in All Photos": "Đã có trong thư viện: đã chọn {} ảnh{:.0} trong Tất cả ảnh",   "Already in “{}”": "Already in “{}”",   "Applied {name}": "Applied {name}",@@ -93,12 +93,12 @@   "Import cancelled · {} photo{} added": "Đã hủy nhập · đã thêm {} ảnh{:.0}",   "Import failed: {e}": "Nhập thất bại: {e}",   "Import warnings ({n}):\n{warnings}": "Cảnh báo khi nhập ({n}):\n{warnings}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "Imported {e} mask effect{} (Masking → Effect)",+  "Imported {e} mask effect{} (Masking → Effect)": "Imported {e} mask effect{} (Masking → Effect)",   "Imported {name}": "Imported {name}",   "Imported {n} point curve preset{}": "Đã nhập {n} thiết lập sẵn đường cong điểm{:.0}",   "Imported {n} preset{}": "Đã nhập {n} thiết lập sẵn{:.0}",   "Imported {n} preset{}, {f} file{} not readable": "Đã nhập {n} thiết lập sẵn{:.0}, {f} tệp{:.0} không đọc được",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "Đã nhập {profiles} hồ sơ{:.0} (Trình duyệt hồ sơ → nhóm của chúng)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "Đã nhập {profiles} hồ sơ{:.0} (Trình duyệt hồ sơ → nhóm của chúng)",   "Imported {} photo{}": "Đã nhập {} ảnh{:.0}",   "In line for AI Denoise ({ahead} ahead)…": "Đang xếp hàng Khử nhiễu AI (trước bạn: {ahead})…",   "Insert at the cursor (also written {})": "Chèn tại con trỏ (cũng ghi là {})",@@ -157,7 +157,7 @@   "Remove “{}” from Favorites": "Gỡ «{}» khỏi Yêu thích",   "Removed from {}": "Đã gỡ khỏi {}",   "Removed {what} from {name}": "Đã gỡ {what} khỏi {name}",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "Removed “{name}” from {n} photos. Edit → Undo puts it back.",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "Removed “{name}” from {n} photos. Edit → Undo puts it back.",   "Rename {n} Photos…": "Đổi tên {n} ảnh…",   "Rename “{name}”": "Đổi tên «{name}»",   "Renames {n} face{} across the library. The files are not changed.": "Renames {n} face{} across the library. The files are not changed.",@@ -249,7 +249,7 @@   "{n} preset{}": "{n} preset{}",   "{n} raws can now be developed from their raw data": "{n} raws can now be developed from their raw data",   "{n} selected photos · {pages} pages": "{n} selected photos · {pages} pages",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "{n} ảnh tương tự{:.0} · Xem → Xóa bộ lọc để thấy tất cả",+  "{n} similar photo{} · View → Clear Filters to see all": "{n} ảnh tương tự{:.0} · Xem → Xóa bộ lọc để thấy tất cả",   "{n} tasks are still running: {names}. Quitting stops them.": "Còn {n} tác vụ đang chạy: {names}. Thoát sẽ dừng chúng.",   "{n} {noun}": "{noun}: {n}",   "{pct} %": "{pct} %",diff --git a/crates/ui-egui/locales/vi.json b/crates/ui-egui/locales/vi.json--- a/crates/ui-egui/locales/vi.json+++ b/crates/ui-egui/locales/vi.json@@ -1291,7 +1291,7 @@   "Photo Grid (G)": "Lưới ảnh (G)",   "Photo Merge": "Ghép ảnh",   "Photo menu. The filmstrip has the photo context menu too. Adding a file again that is in Recently Deleted no": "Menu Ảnh. Dải phim cũng có menu ngữ cảnh ảnh. Thêm lại tệp đang ở Đã xóa gần đây không",-  "Photo ▸ Edit In ▸ Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Ảnh → Chỉnh trong → Chỉnh trong PhotoCraft (⇧⌘E, hoặc nhấp phải ảnh) kết xuất bản sao kèm chỉnh sửa, xếp chồng với bản gốc và mở trong PhotoCraft. Lưu ở đó thì bản sao cập nhật tại đây. Dạng PSD, PhotoCraft lưu thẳng lại. Để trống vị trí trừ khi dùng bản portable.",+  "Photo → Edit In → Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.": "Ảnh → Chỉnh trong → Chỉnh trong PhotoCraft (⇧⌘E, hoặc nhấp phải ảnh) kết xuất bản sao kèm chỉnh sửa, xếp chồng với bản gốc và mở trong PhotoCraft. Lưu ở đó thì bản sao cập nhật tại đây. Dạng PSD, PhotoCraft lưu thẳng lại. Để trống vị trí trừ khi dùng bản portable.",   "Photo ▸ Edit in External Editor (⇧⌘E) renders a 16-bit TIFF copy, stacks it with the original and opens it here (an app name on macOS, a program path elsewhere).": "Ảnh → Chỉnh trong trình soạn ngoài (⇧⌘E) kết xuất bản sao TIFF 16 bit, xếp chồng với bản gốc và mở tại đây (tên app trên macOS, đường dẫn chương trình ở nơi khác).",   "PhotoCraft": "PhotoCraft",   "Photos": "Ảnh",@@ -1484,7 +1484,7 @@   "Remove location info": "Xóa thông tin vị trí",   "Remove missing photos from the library": "Gỡ ảnh mất khỏi thư viện",   "Remove shortcut": "Gỡ lối tắt",-  "Remove this face box (undo with Edit ▸ Undo)": "Gỡ khung khuôn mặt này (hoàn tác bằng Chỉnh sửa → Hoàn tác)",+  "Remove this face box (undo with Edit → Undo)": "Gỡ khung khuôn mặt này (hoàn tác bằng Chỉnh sửa → Hoàn tác)",   "Remove this filter": "Gỡ bộ lọc này",   "Remove this group": "Gỡ nhóm này",   "Remove this rule": "Gỡ quy tắc này",@@ -1543,7 +1543,7 @@   "Revert": "Hoàn tác",   "Review": "Xem lại",   "Review Import": "Xem lại nhập",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "Nhấp phải ảnh → Đặt làm ảnh tham chiếu, rồi Xem → Chế độ tham chiếu (Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "Nhấp phải ảnh → Đặt làm ảnh tham chiếu, rồi Xem → Chế độ tham chiếu (Shift+R)",   "Right-click a preset to delete it": "Nhấp phải thiết lập sẵn để xóa",   "Rights Usage Terms": "Điều khoản sử dụng quyền",   "Rotate": "Xoay",diff --git a/crates/ui-egui/locales/zh-hans-formats.json b/crates/ui-egui/locales/zh-hans-formats.json--- a/crates/ui-egui/locales/zh-hans-formats.json+++ b/crates/ui-egui/locales/zh-hans-formats.json@@ -120,7 +120,7 @@   "Adding photos… {} of {}": "正在添加照片… 第 {0} 张,共 {1} 张",   " ({} in Recently Deleted)": "(其中 {0} 张在“最近删除”中)",   "Already in the library: {} photo{} selected in All Photos": "已在图库中:已在“所有照片”中选择 {0} 张照片{1:.0}",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "已在图库的“最近删除”中:已选择 {0} 张照片{1:.0} · 右键单击 → 恢复,或永久删除后重新导入",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "已在图库的“最近删除”中:已选择 {0} 张照片{1:.0} · 右键单击 → 恢复,或永久删除后重新导入",   "Auto ({})": "自动({})",   "Build 1:1 Previews ({scope})": "生成 1:1 预览({scope})",   "Build Smart Previews ({scope})": "生成智能预览({scope})",@@ -169,7 +169,7 @@   "Lightroom geometry for {path} was not preserved; Guided Upright saved transform is unsupported.": "未保留 {path} 的 Lightroom 几何信息;不支持保存的引导 Upright 变换。",   "Lightroom geometry for {path} was not preserved; saved Upright transform is unsupported.": "未保留 {path} 的 Lightroom 几何信息;不支持保存的 Upright 变换。",   "XMP adjustments were not imported for {path}: {fields}.": "未导入 {path} 的 XMP 调整:{fields}。",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "已导入 {profiles} 个配置文件{0:.0}(配置文件浏览器 → 各自的分组)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "已导入 {profiles} 个配置文件{0:.0}(配置文件浏览器 → 各自的分组)",   "Insert at the cursor (also written {})": "在光标处插入(也可写作 {0})",   "MIT OR Apache-2.0. Fonts: {} (OFL). Icons: original.": "MIT OR Apache-2.0。字体:{0}(OFL)。图标:原创。",   "Painting “{k}”: click photos to add or remove it · Esc stops": "正在应用“{k}”:单击照片以添加或移除 · 按 Esc 停止",@@ -199,7 +199,7 @@   "{} — show their photos": "{0} — 显示其照片",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft 暂时无法解码这种 RAW 变体({0})。你正在编辑相机内嵌的 JPEG 预览,其中已包含相机的照片风格(如单色)和白平衡。",   "Filtered: {label}": "已筛选:{label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "{n} 张相似照片{0:.0} · 选择“视图 → 清除过滤器”可查看全部",+  "{n} similar photo{} · View → Clear Filters to see all": "{n} 张相似照片{0:.0} · 选择“视图 → 清除过滤器”可查看全部",   "Moved; {} photo(s) relinked": "已移动;已重新链接 {0} 张照片",   "{} label (click more labels to show any of them)": "{0}标签(单击更多标签可显示符合其中任一标签的照片)",   ", {} star{}": ",{0} 星{1:.0}",@@ -246,7 +246,7 @@   "Create the keyword “{name}”": "创建关键字“{name}”",   "new, inside {parent}": "新关键字,位于 {parent} 内",   "Keywords of {n} selected photos": "所选 {n} 张照片的关键字",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "已从 {n} 张照片中移除“{name}”。编辑 → 撤销可恢复。",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "已从 {n} 张照片中移除“{name}”。编辑 → 撤销可恢复。",   "1 task is still running: {names}. Quitting stops it.": "仍有 1 个任务在运行:{names}。退出将停止它。",   "{n} tasks are still running: {names}. Quitting stops them.": "仍有 {n} 个任务在运行:{names}。退出将停止它们。",   "{what} merge cancelled": "已取消 {what} 合并",@@ -266,7 +266,7 @@   "Delete {n} effect preset{}? This can't be undone.": "删除 {n} 个效果预设?{:.0}此操作无法撤销。",   "Effect: {name}": "效果:{name}",   "Exported {} effect preset{}": "已导出 {} 个效果预设{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "已导入 {e} 个蒙版效果{:.0}(蒙版 → 效果)",+  "Imported {e} mask effect{} (Masking → Effect)": "已导入 {e} 个蒙版效果{:.0}(蒙版 → 效果)",   "Update “{name}” with Current Settings": "用当前设置更新“{name}”",   "{n} preset{}": "{n} 个预设{:.0}",   "{name} opened in the other editor": "已在其他编辑器中打开 {name}",diff --git a/crates/ui-egui/locales/zh-hans.json b/crates/ui-egui/locales/zh-hans.json--- a/crates/ui-egui/locales/zh-hans.json+++ b/crates/ui-egui/locales/zh-hans.json@@ -662,7 +662,7 @@   "Remove a filter above, or choose Clear all": "请移除上方的某个筛选条件,或选择“全部清除”",   "Remove from Target Album": "从目标相册中移除",   "Remove shortcut": "移除快捷键",-  "Remove this face box (undo with Edit ▸ Undo)": "移除此人脸框(可通过“编辑 → 撤销”恢复)",+  "Remove this face box (undo with Edit → Undo)": "移除此人脸框(可通过“编辑 → 撤销”恢复)",   "Rename Component": "重命名组件",   "Reorder Masks": "重新排序蒙版",   "Reset All": "全部重置",@@ -1237,7 +1237,7 @@   "Revert": "恢复",   "Review": "审阅",   "Review Import": "查看导入内容",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "右键单击照片 » 设为参考照片,然后选择“视图 → 参考视图”(Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "右键单击照片 » 设为参考照片,然后选择“视图 → 参考视图”(Shift+R)",   "Right-click a preset to delete it": "右键单击预设即可将其删除",   "Rights Usage Terms": "使用条款",   "Rotate": "旋转",@@ -2147,7 +2147,7 @@   "Same folder as original photo": "与原始照片相同的文件夹",   "Tidying the thumbnail cache": "正在整理缩略图缓存",   "Reset all edits (Cmd+Shift+R)": "重置所有编辑 (Cmd+Shift+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "智能相册会自动更新:请更改其规则,或使用“照片 → 删除照片”",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "智能相册会自动更新:请更改其规则,或使用“照片 → 删除照片”",   "LightCraft stopped": "LightCraft 已停止",   "Zoom to Focus Point": "缩放至对焦点",   "Focus": "对焦",diff --git a/crates/ui-egui/locales/zh-hant-formats.json b/crates/ui-egui/locales/zh-hant-formats.json--- a/crates/ui-egui/locales/zh-hant-formats.json+++ b/crates/ui-egui/locales/zh-hant-formats.json@@ -141,7 +141,7 @@   "… and {more} more": "…以及另外 {more} 個",   " ({} in Recently Deleted)": "(其中 {} 張在「最近刪除」中)",   "Already in the library: {} photo{} selected in All Photos": "已在照片庫中:已在「所有照片」中選取 {} 張照片{:.0}",-  "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh": "已在照片庫的「最近刪除」中:已選取 {} 張照片{:.0} · 按右鍵 → 還原,或永久刪除後重新匯入",+  "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh": "已在照片庫的「最近刪除」中:已選取 {} 張照片{:.0} · 按右鍵 → 還原,或永久刪除後重新匯入",   "Remove “{name}” and its {count} photo{} from the library?": "要將「{name}」及其 {count} 張照片從照片庫移除嗎?{:.0}",   " ({unsure} with several look-alike files: use Locate)": "(其中 {unsure} 張有多個相似檔案:請使用「尋找」)",   " · {:.0}% clipped": " · {:.0}% 剪裁",@@ -169,7 +169,7 @@   "Lightroom geometry for {path} was not preserved; Guided Upright saved transform is unsupported.": "未保留 {path} 的 Lightroom 幾何資料;不支援儲存的引導 Upright 轉換。",   "Lightroom geometry for {path} was not preserved; saved Upright transform is unsupported.": "未保留 {path} 的 Lightroom 幾何資料;不支援儲存的 Upright 轉換。",   "XMP adjustments were not imported for {path}: {fields}.": "未匯入 {path} 的 XMP 調整:{fields}。",-  "Imported {profiles} profile{} (Profile browser ▸ their groups)": "已匯入 {profiles} 個描述檔{:.0}(描述檔瀏覽器 → 各自的群組)",+  "Imported {profiles} profile{} (Profile browser → their groups)": "已匯入 {profiles} 個描述檔{:.0}(描述檔瀏覽器 → 各自的群組)",   "Insert at the cursor (also written {})": "在游標處插入(也可寫成 {})",   "MIT OR Apache-2.0. Fonts: {} (OFL). Icons: original.": "MIT OR Apache-2.0。字型:{}(OFL)。圖示:原創。",   "Painting “{k}”: click photos to add or remove it · Esc stops": "正在套用「{k}」:點擊照片即可加入或移除 · 按 Esc 停止",@@ -199,7 +199,7 @@   "{} — show their photos": "{} — 顯示其照片",   "LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft 目前還無法解碼這種 RAW 變體({})。你正在編輯相機內嵌的 JPEG 預覽,其中已包含相機的相片風格(例如單色)與白平衡。",   "Filtered: {label}": "已篩選:{label}",-  "{n} similar photo{} · View ▸ Clear Filters to see all": "{n} 張相似照片{:.0} · 選擇「檢視 → 清除篩選條件」可查看全部",+  "{n} similar photo{} · View → Clear Filters to see all": "{n} 張相似照片{:.0} · 選擇「檢視 → 清除篩選條件」可查看全部",   "Moved; {} photo(s) relinked": "已移動;已重新連結 {} 張照片",   "{} label (click more labels to show any of them)": "{}標籤(點擊更多標籤可顯示符合其中任一標籤的照片)",   ", {} star{}": ",{} 顆星{:.0}",@@ -246,7 +246,7 @@   "Create the keyword “{name}”": "建立關鍵字「{name}」",   "new, inside {parent}": "新關鍵字,位於 {parent} 內",   "Keywords of {n} selected photos": "選取的 {n} 張照片的關鍵字",-  "Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "已從 {n} 張照片移除「{name}」。編輯 → 復原可恢復。",+  "Removed “{name}” from {n} photos. Edit → Undo puts it back.": "已從 {n} 張照片移除「{name}」。編輯 → 復原可恢復。",   "1 task is still running: {names}. Quitting stops it.": "仍有 1 個工作在執行:{names}。結束將停止它。",   "{n} tasks are still running: {names}. Quitting stops them.": "仍有 {n} 個工作在執行:{names}。結束將停止它們。",   "{what} merge cancelled": "已取消{what}合併",@@ -266,7 +266,7 @@   "Delete {n} effect preset{}? This can't be undone.": "刪除 {n} 個效果預設集?{:.0}此動作無法復原。",   "Effect: {name}": "效果:{name}",   "Exported {} effect preset{}": "已匯出 {} 個效果預設集{:.0}",-  "Imported {e} mask effect{} (Masking ▸ Effect)": "已匯入 {e} 個遮色片效果{:.0}(遮色片 → 效果)",+  "Imported {e} mask effect{} (Masking → Effect)": "已匯入 {e} 個遮色片效果{:.0}(遮色片 → 效果)",   "Update “{name}” with Current Settings": "以目前設定更新「{name}」",   "{n} preset{}": "{n} 個預設集{:.0}",   "{name} opened in the other editor": "已在其他編輯器中開啟 {name}",diff --git a/crates/ui-egui/locales/zh-hant.json b/crates/ui-egui/locales/zh-hant.json--- a/crates/ui-egui/locales/zh-hant.json+++ b/crates/ui-egui/locales/zh-hant.json@@ -663,7 +663,7 @@   "Remove a filter above, or choose Clear all": "請移除上方的某個篩選條件,或選擇「全部清除」",   "Remove from Target Album": "從目標相簿移除",   "Remove shortcut": "移除快速鍵",-  "Remove this face box (undo with Edit ▸ Undo)": "移除此臉部框(可用「編輯 → 復原」還原)",+  "Remove this face box (undo with Edit → Undo)": "移除此臉部框(可用「編輯 → 復原」還原)",   "Rename Component": "重新命名元件",   "Reorder Masks": "重新排序遮色片",   "Reset All": "全部重設",@@ -1238,7 +1238,7 @@   "Revert": "回復至上次儲存",   "Review": "審閱",   "Review Import": "檢視匯入",-  "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)": "在照片上按右鍵 → 設為參考照片,再選擇「檢視 → 參考檢視」(Shift+R)",+  "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)": "在照片上按右鍵 → 設為參考照片,再選擇「檢視 → 參考檢視」(Shift+R)",   "Right-click a preset to delete it": "在預設集上按右鍵即可刪除",   "Rights Usage Terms": "使用權利條款",   "Rotate": "旋轉",@@ -2115,7 +2115,7 @@   "Same folder as original photo": "與原始照片相同的資料夾",   "Tidying the thumbnail cache": "正在整理縮圖快取",   "Reset all edits (Cmd+Shift+R)": "重設所有編輯(Cmd+Shift+R)",-  "Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo": "智慧型相簿會自動更新:請變更其規則,或使用「照片 → 刪除照片」",+  "Smart albums update automatically: change their rules, or use Photo → Delete Photo": "智慧型相簿會自動更新:請變更其規則,或使用「照片 → 刪除照片」",   "LightCraft stopped": "LightCraft 已停止",   "Focus Point": "對焦點",   "Zoom to Focus Point": "縮放至對焦點",diff --git a/crates/ui-egui/src/dialogs/import/task.rs b/crates/ui-egui/src/dialogs/import/task.rs--- a/crates/ui-egui/src/dialogs/import/task.rs+++ b/crates/ui-egui/src/dialogs/import/task.rs@@ -534,7 +534,7 @@ fn show_existing(app: &mut LightcraftApp, ctx: &egui::Context, existing: &[u64])         crate::i18n::tr_format!("Already in the library: {} photo{} selected in All Photos", n, plural)     } else {         crate::i18n::tr_format!(-            "Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh",+            "Already in the library, in Recently Deleted: {} photo{} selected · right-click → Restore, or Delete Permanently to import afresh",             n,             plural         )diff --git a/crates/ui-egui/src/dialogs/rules_editor/rules_move.rs b/crates/ui-egui/src/dialogs/rules_editor/rules_move.rs--- a/crates/ui-egui/src/dialogs/rules_editor/rules_move.rs+++ b/crates/ui-egui/src/dialogs/rules_editor/rules_move.rs@@ -154,7 +154,7 @@ pub fn move_node(rs: &mut RuleSet, from: &[usize], dest: &[usize]) -> Option<Vec     }     let mut chain = from.get(..from.len().checked_sub(1)?)?.to_vec();     // (a group the row is going into stays, however empty it is for now)-    while !chain.is_empty() && !(dest.len() > chain.len() && dest.starts_with(&chain)) && list_at(&next, &chain).is_some_and(|l| l.rules.is_empty()) {+    while !(chain.is_empty() || dest.len() > chain.len() && dest.starts_with(&chain)) && list_at(&next, &chain).is_some_and(|l| l.rules.is_empty()) {         remove_at(&mut next, &chain)?;         if !shift_after_removal(&mut dest, &chain) {             return None;diff --git a/crates/ui-egui/src/dialogs/settings/general.rs b/crates/ui-egui/src/dialogs/settings/general.rs--- a/crates/ui-egui/src/dialogs/settings/general.rs+++ b/crates/ui-egui/src/dialogs/settings/general.rs@@ -3,6 +3,7 @@ use super::*;  // ------------------------------------------------------------------------------------- General +/// Draw the General settings tab, including language and library-location controls. pub(super) fn general_tab(app: &mut LightcraftApp, ui: &mut egui::Ui, t: &Tokens) {     row(ui, t, crate::i18n::tr("Language"), |ui| {         let languages: Vec<_> = crate::i18n::Locale::for_picker().into_iter().map(|language| (language, language.name())).collect();@@ -87,7 +88,7 @@ pub(super) fn general_tab(app: &mut LightcraftApp, ui: &mut egui::Ui, t: &Tokens         ui,         t,         crate::i18n::tr(-            "Photo ▸ Edit In ▸ Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.",+            "Photo → Edit In → Edit in PhotoCraft (⇧⌘E, or right-click a photo) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. Save there and the copy updates here. As PSD, PhotoCraft saves straight back to it. Leave the location empty unless you use a portable copy.",         ),     );     row(ui, t, crate::i18n::tr("Other editor"), |ui| {diff --git a/crates/ui-egui/src/dialogs/settings/libraries.rs b/crates/ui-egui/src/dialogs/settings/libraries.rs--- a/crates/ui-egui/src/dialogs/settings/libraries.rs+++ b/crates/ui-egui/src/dialogs/settings/libraries.rs@@ -160,7 +160,7 @@ pub fn new_library(app: &mut LightcraftApp, p: &Value) -> Result<Value, String>         None => location,     };     if lightcraft_engine::library::is_library(&dir) {-        return Err(format!("{}: there is a library here already; open it with File ▸ Open Library…", dir.display()));+        return Err(format!("{}: there is a library here already; open it with File → Open Library…", dir.display()));     }     if dir.is_file() {         return Err(format!("{}: is a file; a library is a folder", dir.display()));diff --git a/crates/ui-egui/src/menus/files.rs b/crates/ui-egui/src/menus/files.rs--- a/crates/ui-egui/src/menus/files.rs+++ b/crates/ui-egui/src/menus/files.rs@@ -8,7 +8,7 @@ pub fn delete_in_album(app: &mut LightcraftApp, ctx: &egui::Context) -> bool {     let lightcraft_engine::LibrarySource::Album(aid) = app.session.source else { return false };     let Some(album) = app.session.catalog.album(aid) else { return false };     if album.is_smart() {-        app.toast(ctx, crate::i18n::tr("Smart albums update automatically: change their rules, or use Photo ▸ Delete Photo"));+        app.toast(ctx, crate::i18n::tr("Smart albums update automatically: change their rules, or use Photo → Delete Photo"));         return true;     }     if app.session.selected().is_empty() {diff --git a/crates/ui-egui/src/menus/run.rs b/crates/ui-egui/src/menus/run.rs--- a/crates/ui-egui/src/menus/run.rs+++ b/crates/ui-egui/src/menus/run.rs@@ -1678,7 +1678,7 @@ pub fn run_ui_command(app: &mut LightcraftApp, id: &str, p: &Value) -> Option<Re                         let profiles = v["imported"].as_array().map_or(0, Vec::len);                         if profiles > 0 {                             parts.push(crate::i18n::tr_format!(-                                "Imported {profiles} profile{} (Profile browser ▸ their groups)",+                                "Imported {profiles} profile{} (Profile browser → their groups)",                                 if profiles == 1 { "" } else { "s" },                                 profiles = profiles                             ));diff --git a/crates/ui-egui/src/panels/compare.rs b/crates/ui-egui/src/panels/compare.rs--- a/crates/ui-egui/src/panels/compare.rs+++ b/crates/ui-egui/src/panels/compare.rs@@ -601,7 +601,7 @@ pub fn show_reference(app: &mut LightcraftApp, ui: &mut egui::Ui) {     let canvas = area_and_filmstrip(app, ui);     let reference = app.ui.reference.map(PhotoId).filter(|r| live(app, *r));     let (Some(r), Some(active)) = (reference, app.session.active()) else {-        super::empty_message(ui, canvas, "No reference photo", "Right-click a photo ▸ Set as Reference Photo, then View → Reference View (Shift+R)");+        super::empty_message(ui, canvas, "No reference photo", "Right-click a photo → Set as Reference Photo, then View → Reference View (Shift+R)");         return;     };     let area = canvas.shrink(18.0);diff --git a/crates/ui-egui/src/panels/detail/masks.rs b/crates/ui-egui/src/panels/detail/masks.rs--- a/crates/ui-egui/src/panels/detail/masks.rs+++ b/crates/ui-egui/src/panels/detail/masks.rs@@ -113,7 +113,7 @@ pub(super) fn region_overlay(             let cross = Stroke::new(1.4, if resp.hovered() { Color32::WHITE } else { Color32::from_gray(210) });             p.line_segment([c - vec2(m, m), c + vec2(m, m)], cross);             p.line_segment([c - vec2(m, -m), c + vec2(m, -m)], cross);-            if resp.on_hover_text(crate::i18n::tr("Remove this face box (undo with Edit ▸ Undo)")).clicked() {+            if resp.on_hover_text(crate::i18n::tr("Remove this face box (undo with Edit → Undo)")).clicked() {                 edit = Some(RegionEdit::Remove(index));             }         }diff --git a/crates/ui-egui/src/panels/grid.rs b/crates/ui-egui/src/panels/grid.rs--- a/crates/ui-egui/src/panels/grid.rs+++ b/crates/ui-egui/src/panels/grid.rs@@ -1214,6 +1214,7 @@ pub fn toggle_stack(app: &mut LightcraftApp, ctx: &egui::Context, id: PhotoId) {     } } +/// Draw the photo's grid context menu and dispatch the selected action. pub fn context_menu(app: &mut LightcraftApp, ui: &mut egui::Ui, id: PhotoId) {     if !app.session.selection.contains(id) {         let _ = app.run("library.select", json!({"ids": [id.0]}));@@ -1250,7 +1251,7 @@ pub fn context_menu(app: &mut LightcraftApp, ui: &mut egui::Ui, id: PhotoId) {                 app.ui.view = crate::state::ViewMode::PhotoGrid;                 app.toast(                     ui.ctx(),-                    crate::i18n::tr_format!("{n} similar photo{} · View ▸ Clear Filters to see all", if n == 1 { "" } else { "s" }, n = n),+                    crate::i18n::tr_format!("{n} similar photo{} · View → Clear Filters to see all", if n == 1 { "" } else { "s" }, n = n),                 );             }             Err(e) => app.toast(ui.ctx(), e),diff --git a/crates/ui-egui/src/panels/keywording.rs b/crates/ui-egui/src/panels/keywording.rs--- a/crates/ui-egui/src/panels/keywording.rs+++ b/crates/ui-egui/src/panels/keywording.rs@@ -134,7 +134,7 @@ fn remove(app: &mut LightcraftApp, ctx: &egui::Context, chip: &Chip) {             let name = chip.path.replace('|', " › ");             app.toast_for(                 ctx,-                crate::i18n::tr_format!("Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.", name = name, n = chip.have),+                crate::i18n::tr_format!("Removed “{name}” from {n} photos. Edit → Undo puts it back.", name = name, n = chip.have),                 6.0,             );         }diff --git a/crates/ui-egui/src/panels/mask_effects.rs b/crates/ui-egui/src/panels/mask_effects.rs--- a/crates/ui-egui/src/panels/mask_effects.rs+++ b/crates/ui-egui/src/panels/mask_effects.rs@@ -688,7 +688,7 @@ pub fn manage_body( pub fn import_toast(v: &Value) -> String {     let rows: Vec<&Value> = v["effects"].as_array().or_else(|| v["imported"].as_array()).into_iter().flatten().collect();     let n = rows.len();-    let mut msg = crate::i18n::tr_format!("Imported {e} mask effect{} (Masking ▸ Effect)", if n == 1 { "" } else { "s" }, e = n);+    let mut msg = crate::i18n::tr_format!("Imported {e} mask effect{} (Masking → Effect)", if n == 1 { "" } else { "s" }, e = n);     let mut groups: Vec<&str> = rows.iter().filter_map(|r| r["group"].as_str()).filter(|g| !g.is_empty()).collect();     groups.sort_unstable();     groups.dedup();