diff --git a/crates/ui-egui/locales/cs-formats.json b/crates/ui-egui/locales/cs-formats.json index 1eb882f09..5d6a2c187 100644 --- a/crates/ui-egui/locales/cs-formats.json +++ b/crates/ui-egui/locales/cs-formats.json @@ -46,6 +46,7 @@ "Build Standard-Sized Previews ({scope})": "Vytvořit standardní náhledy ({scope})", "Building previews for {} photos…": "Vytváření náhledů pro fotografie: {}…", "Click {}:1": "Kliknutí {}:1", + "Collapse {name}": "Sbalit {name}", "Couldn't open the editor: {e}": "Editor se nepodařilo otevřít: {e}", "Create Keyword Tag Inside “{name}”…": "Vytvořit značku klíčového slova uvnitř „{name}“…", "Create {n} Virtual Copies": "Vytvořit virtuální kopie: {n}", @@ -62,6 +63,7 @@ "Downloads from {host}. Once it has arrived and checked out, LightCraft installs it, {after}.": "Stahuje se z {host}. Po stažení a ověření jej LightCraft nainstaluje a {after}.", "Duplicate \"{label}\"": "Duplikovat „{label}“", "Example: {example}": "Příklad: {example}", + "Expand {name}": "Rozbalit {name}", "Exported {n} keyword{}": "Exportovaná klíčová slova: {n}{:.0}", "Exported {n} photo{}": "Exportováno fotografií: {n}{:.0}", "Exported {ok} of {total} photo{}": "Exportováno fotografií: {ok} z {total}{:.0}", diff --git a/crates/ui-egui/locales/cs.json b/crates/ui-egui/locales/cs.json index 52ca94a52..c9ca899e6 100644 --- a/crates/ui-egui/locales/cs.json +++ b/crates/ui-egui/locales/cs.json @@ -402,7 +402,6 @@ "Close file": "Zavřít soubor", "Close panel": "Zavřít boční panel", "Cloudy": "Zataženo", - "Collapse": "Sbalit", "Collapse All Stacks": "Sbalit všechny sady", "Collapse Stack": "Sbalit sadu", "Color": "Barva", diff --git a/crates/ui-egui/locales/de-formats.json b/crates/ui-egui/locales/de-formats.json index 79390f136..b7f9f67fd 100644 --- a/crates/ui-egui/locales/de-formats.json +++ b/crates/ui-egui/locales/de-formats.json @@ -36,6 +36,7 @@ "Build Standard-Sized Previews ({scope})": "Standardvorschauen erstellen ({scope})", "Building previews for {} photos…": "Vorschauen für {} Fotos werden erstellt…", "Click {}:1": "Klick {}:1", + "Collapse {name}": "{name} einklappen", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Farbraum: Rec. 2020 {curve} (HDR-AVIF)", "Couldn't open the editor: {e}": "Editor konnte nicht geöffnet werden: {e}", "Create {n} Virtual Copies": "{n} virtuelle Kopien erstellen", @@ -49,6 +50,7 @@ "Done ({what}): {done} photo{plural}": "Fertig ({what}): {done} Foto{plural}", "Duplicate \"{label}\"": "„{label}“ duplizieren", "Example: {example}": "Beispiel: {example}", + "Expand {name}": "{name} ausklappen", "Exported {n} photo{}": "{n} Foto{} exportiert", "Exported {ok} of {total} photo{}": "{ok} von {total} Foto{} exportiert", "Exported {} point curve preset{}": "Exportierte Punktkurvenvorgaben: {}{:.0}", diff --git a/crates/ui-egui/locales/de.json b/crates/ui-egui/locales/de.json index e2205db78..fee4506dd 100644 --- a/crates/ui-egui/locales/de.json +++ b/crates/ui-egui/locales/de.json @@ -261,7 +261,6 @@ "Close panel": "Bedienfeld schließen", "Cloudy": "Bewölkt", "Cmd+Shift+R, keeps the photo and clears its edits.)": "mit ⌘⇧R die Bearbeitungen zurück und behält das Foto.", - "Collapse": "Einklappen", "Collapse All Stacks": "Alle Stapel einklappen", "Collapse Stack": "Stapel einklappen", "Color": "Farbe", diff --git a/crates/ui-egui/locales/es-formats.json b/crates/ui-egui/locales/es-formats.json index 33e5f52fc..2fb9e1cbd 100644 --- a/crates/ui-egui/locales/es-formats.json +++ b/crates/ui-egui/locales/es-formats.json @@ -36,6 +36,7 @@ "Build Standard-Sized Previews ({scope})": "Generar vistas previas de tamaño estándar ({scope})", "Building previews for {} photos…": "Generando vistas previas de {} fotos…", "Click {}:1": "Clic {}:1", + "Collapse {name}": "Contraer {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Espacio de color: Rec. 2020 {curve} (AVIF HDR)", "Couldn't open the editor: {e}": "No se pudo abrir el editor: {e}", "Create {n} Virtual Copies": "Crear {n} copias virtuales", @@ -49,6 +50,7 @@ "Done ({what}): {done} photo{plural}": "Listo ({what}): {done} foto{plural}", "Duplicate \"{label}\"": "Duplicar \"{label}\"", "Example: {example}": "Ejemplo: {example}", + "Expand {name}": "Expandir {name}", "Exported {n} photo{}": "{n} foto{0} exportada{0}", "Exported {ok} of {total} photo{}": "Exportadas {ok} de {total} foto{}", "Exported {} point curve preset{}": "{0} ajuste{1} preestablecido{1} de curva de puntos exportado{1}", diff --git a/crates/ui-egui/locales/es.json b/crates/ui-egui/locales/es.json index 888af077f..d3f97d27d 100644 --- a/crates/ui-egui/locales/es.json +++ b/crates/ui-egui/locales/es.json @@ -253,7 +253,6 @@ "Close file": "Cerrar archivo", "Close panel": "Cerrar panel", "Cloudy": "Nublado", - "Collapse": "Contraer", "Collapse All Stacks": "Contraer todas las pilas", "Collapse Stack": "Contraer pila", "Color": "Color", diff --git a/crates/ui-egui/locales/fi-formats.json b/crates/ui-egui/locales/fi-formats.json index 1daab3dab..135facd13 100644 --- a/crates/ui-egui/locales/fi-formats.json +++ b/crates/ui-egui/locales/fi-formats.json @@ -53,6 +53,7 @@ "Build Standard-Sized Previews ({scope})": "Luo vakiokokoiset esikatselut ({scope})", "Building previews for {} photos…": "Luodaan esikatseluja {} kuvalle…", "Click {}:1": "Napsautus {}:1", + "Collapse {name}": "Tiivistä {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Väriavaruus: Rec. 2020 {curve} (HDR AVIF)", "Couldn't open the editor: {e}": "Muokkausohjelmaa ei voitu avata: {e}", "Create Keyword Tag Inside “{name}”…": "Luo avainsanatunniste kohteen ”{name}” sisään…", @@ -76,6 +77,7 @@ "Duplicate \"{label}\"": "Monista ”{label}”", "Effect: {name}": "Tehoste: {name}", "Example: {example}": "Esimerkki: {example}", + "Expand {name}": "Laajenna {name}", "Exported to {path}": "Viety kohteeseen {path}", "Exported {n} keyword{}": "Viety avainsanoja: {n}{:.0}", "Exported {n} photo{}": "Viety kuvia: {n}{:.0}", diff --git a/crates/ui-egui/locales/fi.json b/crates/ui-egui/locales/fi.json index e0a8c622a..2b25d1820 100644 --- a/crates/ui-egui/locales/fi.json +++ b/crates/ui-egui/locales/fi.json @@ -338,7 +338,6 @@ "Close file": "Sulje tiedosto", "Close panel": "Sulje paneeli", "Cloudy": "Pilvinen", - "Collapse": "Tiivistä", "Collapse All Stacks": "Tiivistä kaikki pinot", "Collapse Stack": "Tiivistä pino", "Color": "Väri", diff --git a/crates/ui-egui/locales/fr-formats.json b/crates/ui-egui/locales/fr-formats.json index 294273781..cbdf705a6 100644 --- a/crates/ui-egui/locales/fr-formats.json +++ b/crates/ui-egui/locales/fr-formats.json @@ -36,6 +36,7 @@ "Build Standard-Sized Previews ({scope})": "Créer les aperçus de taille standard ({scope})", "Building previews for {} photos…": "Création des aperçus pour {} photos…", "Click {}:1": "Cliquer sur {}:1", + "Collapse {name}": "Réduire {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Espace colorimétrique : Rec. 2020 {curve} (AVIF HDR)", "Couldn't open the editor: {e}": "Impossible d’ouvrir l’éditeur : {e}", "Create {n} Virtual Copies": "Créer {n} copies virtuelles", @@ -49,6 +50,7 @@ "Done ({what}): {done} photo{plural}": "Terminé ({what}) : {done} photo{plural}", "Duplicate \"{label}\"": "Dupliquer « {label} »", "Example: {example}": "Exemple : {example}", + "Expand {name}": "Développer {name}", "Exported {n} photo{}": "{n} photo{} exportée(s)", "Exported {ok} of {total} photo{}": "{ok} photo{} exportée(s) sur {total}", "Exported {} point curve preset{}": "{} préréglage{} de courbe à points exporté(s)", diff --git a/crates/ui-egui/locales/fr.json b/crates/ui-egui/locales/fr.json index 3278d6ccd..94c47770a 100644 --- a/crates/ui-egui/locales/fr.json +++ b/crates/ui-egui/locales/fr.json @@ -238,7 +238,6 @@ "Close all": "Tout fermer", "Close file": "Fermer le fichier", "Cloudy": "Nuageux", - "Collapse": "Réduire", "Collapse All Stacks": "Réduire toutes les piles", "Collapse Stack": "Réduire la pile", "Color": "Couleur", diff --git a/crates/ui-egui/locales/id-formats.json b/crates/ui-egui/locales/id-formats.json index 7fc325522..886fe2f13 100644 --- a/crates/ui-egui/locales/id-formats.json +++ b/crates/ui-egui/locales/id-formats.json @@ -17,6 +17,7 @@ "Auto Sync: edits apply to {n} photos": "Sinkronisasi otomatis: edit diterapkan ke {n} foto", "Automatic ({} MB)": "Otomatis ({} MB)", "Click {}:1": "Klik {}:1", + "Collapse {name}": "Ciutkan {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Ruang warna: Rec. 2020 {curve} (AVIF HDR)", "Create {n} Virtual Copies": "Buat {n} salinan virtual", "Decoder: {reason}": "Dekoder: {reason}", @@ -26,6 +27,7 @@ "Delete “{current}”": "Hapus “{current}”", "Duplicate \"{label}\"": "Duplikat \"{label}\"", "Example: {example}": "Contoh: {example}", + "Expand {name}": "Luaskan {name}", "Exported {n} photo{}": "{n} foto{:.0} diekspor", "Exported {ok} of {total} photo{}": "{ok} dari {total} foto diekspor{:.0}", "Exported {} point curve preset{}": "{} preset kurva titik{:.0} diekspor", diff --git a/crates/ui-egui/locales/id.json b/crates/ui-egui/locales/id.json index 0d6da9b8f..b853abdd3 100644 --- a/crates/ui-egui/locales/id.json +++ b/crates/ui-egui/locales/id.json @@ -340,7 +340,6 @@ "Close file": "Tutup file", "Close panel": "Tutup panel", "Cloudy": "Berawan", - "Collapse": "Ciutkan", "Collapse All Stacks": "Ciutkan semua tumpukan", "Collapse Stack": "Ciutkan tumpukan", "Color": "Warna", diff --git a/crates/ui-egui/locales/it-formats.json b/crates/ui-egui/locales/it-formats.json index 7efae90e9..468f59316 100644 --- a/crates/ui-egui/locales/it-formats.json +++ b/crates/ui-egui/locales/it-formats.json @@ -36,6 +36,7 @@ "Build Standard-Sized Previews ({scope})": "Genera anteprime di dimensione standard ({scope})", "Building previews for {} photos…": "Generazione delle anteprime per {} foto…", "Click {}:1": "Clic {}:1", + "Collapse {name}": "Comprimi {name}", "Couldn't open the editor: {e}": "Impossibile aprire l'editor: {e}", "Create {n} Virtual Copies": "Crea {n} copie virtuali", "Creates {} stacks from {} of {scope}": "Crea pile: {} (da {} di {scope})", @@ -48,6 +49,7 @@ "Done ({what}): {done} photo{plural}": "Fatto ({what}): {done} foto{plural:.0}", "Duplicate \"{label}\"": "Duplica \"{label}\"", "Example: {example}": "Esempio: {example}", + "Expand {name}": "Espandi {name}", "Exported {n} photo{}": "Foto esportate: {n}{:.0}", "Exported {ok} of {total} photo{}": "Foto esportate: {ok} di {total}{:.0}", "Exported {} point curve preset{}": "Preset di curva a punti esportati: {}{:.0}", diff --git a/crates/ui-egui/locales/it.json b/crates/ui-egui/locales/it.json index e159fd47d..b76fd31c7 100644 --- a/crates/ui-egui/locales/it.json +++ b/crates/ui-egui/locales/it.json @@ -240,7 +240,6 @@ "Close file": "Chiudi file", "Close panel": "Chiudi pannello", "Cloudy": "Nuvoloso", - "Collapse": "Comprimi", "Collapse All Stacks": "Comprimi tutte le pile", "Collapse Stack": "Comprimi pila", "Color": "Colore", diff --git a/crates/ui-egui/locales/ja-formats.json b/crates/ui-egui/locales/ja-formats.json index 99c14bf16..0509d930a 100644 --- a/crates/ui-egui/locales/ja-formats.json +++ b/crates/ui-egui/locales/ja-formats.json @@ -17,6 +17,7 @@ "Auto Sync: edits apply to {n} photos": "自動同期:{n}枚に編集を適用", "Automatic ({} MB)": "自動({}MB)", "Click {}:1": "クリック時 {}:1", + "Collapse {name}": "{name}を折りたたむ", "Color space: Rec. 2020 {curve} (HDR AVIF)": "カラースペース:Rec. 2020 {curve}(HDR AVIF)", "Create {n} Virtual Copies": "{n}枚の仮想コピーを作成", "Decoder: {reason}": "デコーダー:{reason}", @@ -26,6 +27,7 @@ "Delete “{current}”": "「{current}」を削除", "Duplicate \"{label}\"": "「{label}」を複製", "Example: {example}": "例:{example}", + "Expand {name}": "{name}を展開", "Exported {n} photo{}": "{n}枚を書き出しました{:.0}", "Exported {ok} of {total} photo{}": "{total}枚中{ok}枚を書き出しました{:.0}", "Exported {} point curve preset{}": "{}件のポイントカーブを書き出しました{:.0}", diff --git a/crates/ui-egui/locales/ja.json b/crates/ui-egui/locales/ja.json index e1834555b..578fcfad3 100644 --- a/crates/ui-egui/locales/ja.json +++ b/crates/ui-egui/locales/ja.json @@ -1659,7 +1659,6 @@ "Moves the photos imported from this folder to Recently Deleted; no file is touched": "このフォルダから読み込んだ写真を「最近削除した写真」に移動します。ファイルには手を加えません", "Remove Disk from Library…": "ディスクをライブラリから除去…", "Moves every photo imported from this disk to Recently Deleted; no file is touched": "このディスクから読み込んだすべての写真を「最近削除した写真」に移動します。ファイルには手を加えません", - "Collapse": "折りたたむ", "Expand": "展開", "Remove Disk from Library": "ディスクをライブラリから除去", "All the photos imported from this disk are included.": "このディスクから読み込んだすべての写真が対象です", diff --git a/crates/ui-egui/locales/ka-formats.json b/crates/ui-egui/locales/ka-formats.json index 460368261..9105d86eb 100644 --- a/crates/ui-egui/locales/ka-formats.json +++ b/crates/ui-egui/locales/ka-formats.json @@ -46,6 +46,7 @@ "Build Standard-Sized Previews ({scope})": "სტანდარტული ზომის წინასწარი ხედების შექმნა ({scope})", "Building previews for {} photos…": "იქმნება წინასწარი ხედები ფოტოებისთვის: {}…", "Click {}:1": "დაწკაპუნება {}:1", + "Collapse {name}": "ჩაკეცვა: {name}", "Couldn't open the editor: {e}": "რედაქტორი ვერ გაიხსნა: {e}", "Create Keyword Tag Inside “{name}”…": "საკვანძო სიტყვის შექმნა „{name}“-ში…", "Create {n} Virtual Copies": "ვირტუალური ასლების შექმნა: {n}", @@ -62,6 +63,7 @@ "Downloads from {host}. Once it has arrived and checked out, LightCraft installs it, {after}.": "ჩამოიტვირთება {host}-დან. მიღებისა და შემოწმების შემდეგ LightCraft მას დააყენებს, {after}.", "Duplicate \"{label}\"": "„{label}“-ის დუბლირება", "Example: {example}": "მაგალითი: {example}", + "Expand {name}": "გაშლა: {name}", "Exported {n} keyword{}": "ექსპორტირებულია საკვანძო სიტყვა: {n}{:.0}", "Exported {n} photo{}": "ექსპორტირებულია ფოტო: {n}{:.0}", "Exported {ok} of {total} photo{}": "ექსპორტირებულია ფოტო: {ok} / {total}{:.0}", diff --git a/crates/ui-egui/locales/ka.json b/crates/ui-egui/locales/ka.json index 32c407700..68df986b7 100644 --- a/crates/ui-egui/locales/ka.json +++ b/crates/ui-egui/locales/ka.json @@ -403,7 +403,6 @@ "Closing a library releases its lock explicitly (issue #680). On Linux and macOS the lock used to go with the file": "ბიბლიოთეკის დახურვა მის ბლოკს ცხადად ათავისუფლებს (ხარვეზი #680). Linux-სა და macOS-ზე ბლოკი ადრე ფაილის", "Cloudy": "მოღრუბლული", "Cmd+Shift+R, keeps the photo and clears its edits.)": "Cmd+Shift+R, ფოტოს ინარჩუნებს და მის ცვლილებებს აუქმებს.)", - "Collapse": "ჩაკეცვა", "Collapse All Stacks": "ყველა დასტის ჩაკეცვა", "Collapse Stack": "დასტის ჩაკეცვა", "Color": "ფერი", diff --git a/crates/ui-egui/locales/pl-formats.json b/crates/ui-egui/locales/pl-formats.json index 20c7f840d..264138940 100644 --- a/crates/ui-egui/locales/pl-formats.json +++ b/crates/ui-egui/locales/pl-formats.json @@ -36,6 +36,7 @@ "Build Standard-Sized Previews ({scope})": "Utwórz podglądy o standardowym rozmiarze ({scope})", "Building previews for {} photos…": "Tworzenie podglądów (zdjęcia: {})…", "Click {}:1": "Kliknij {}:1", + "Collapse {name}": "Zwiń {name}", "Couldn't open the editor: {e}": "Nie można otworzyć edytora: {e}", "Create {n} Virtual Copies": "Utwórz {n} kopii wirtualnych", "Creates {} stacks from {} of {scope}": "Tworzy {} stosów z {} w zakresie: {scope}", @@ -48,6 +49,7 @@ "Done ({what}): {done} photo{plural}": "Gotowe ({what}) — zdjęcia: {done}{plural:.0}", "Duplicate \"{label}\"": "Duplikuj „{label}”", "Example: {example}": "Przykład: {example}", + "Expand {name}": "Rozwiń {name}", "Exported {n} photo{}": "Wyeksportowane zdjęcia: {n}{:.0}", "Exported {ok} of {total} photo{}": "Wyeksportowane zdjęcia: {ok} z {total}{:.0}", "Exported {} point curve preset{}": "Wyeksportowane ustawienia krzywej punktowej: {}{:.0}", diff --git a/crates/ui-egui/locales/pl.json b/crates/ui-egui/locales/pl.json index adac22e62..0f43a542b 100644 --- a/crates/ui-egui/locales/pl.json +++ b/crates/ui-egui/locales/pl.json @@ -235,7 +235,6 @@ "Close file": "Zamknij plik", "Close panel": "Zamknij panel", "Cloudy": "Pochmurno", - "Collapse": "Zwiń", "Collapse All Stacks": "Zwiń wszystkie stosy", "Collapse Stack": "Zwiń stos", "Color": "Kolor", diff --git a/crates/ui-egui/locales/pt-br-formats.json b/crates/ui-egui/locales/pt-br-formats.json index f17f2c0fd..e59230589 100644 --- a/crates/ui-egui/locales/pt-br-formats.json +++ b/crates/ui-egui/locales/pt-br-formats.json @@ -25,6 +25,7 @@ "Build Smart Previews ({scope})": "Gerar pré-visualizações inteligentes ({scope})", "Build Standard-Sized Previews ({scope})": "Gerar pré-visualizações em tamanho padrão ({scope})", "Click {}:1": "Clique em {}:1", + "Collapse {name}": "Recolher {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Espaço de cor: Rec. 2020 {curve} (AVIF HDR)", "Create {n} Virtual Copies": "Criar {n} cópias virtuais", "Decoder: {reason}": "Decodificador: {reason}", @@ -35,6 +36,7 @@ "Discard Smart Previews ({scope})": "Descartar pré-visualizações inteligentes ({scope})", "Duplicate \"{label}\"": "Duplicar \"{label}\"", "Example: {example}": "Exemplo: {example}", + "Expand {name}": "Expandir {name}", "Exported {n} photo{}": "{n} foto{0} exportada{0}", "Exported {ok} of {total} photo{}": "Fotos exportadas: {ok} de {total}{:.0}", "Exported {} point curve preset{}": "{} predefinição(ões) de curva de pontos exportada(s){:.0}", diff --git a/crates/ui-egui/locales/pt-br.json b/crates/ui-egui/locales/pt-br.json index e84fb7615..ef7195bdb 100644 --- a/crates/ui-egui/locales/pt-br.json +++ b/crates/ui-egui/locales/pt-br.json @@ -246,7 +246,6 @@ "Close file": "Fechar arquivo", "Close panel": "Fechar painel", "Cloudy": "Nublado", - "Collapse": "Recolher", "Collapse All Stacks": "Recolher todas as pilhas", "Collapse Stack": "Recolher pilha", "Color": "Cor", diff --git a/crates/ui-egui/locales/ru-formats.json b/crates/ui-egui/locales/ru-formats.json index 76b7af427..9a6758431 100644 --- a/crates/ui-egui/locales/ru-formats.json +++ b/crates/ui-egui/locales/ru-formats.json @@ -38,6 +38,7 @@ "Build Standard-Sized Previews ({scope})": "Создать просмотры стандартного размера ({scope})", "Building previews for {} photos…": "Создание просмотров для фото: {}…", "Click {}:1": "Щелчок {}:1", + "Collapse {name}": "Свернуть: {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Цветовое пространство: Rec. 2020 {curve} (HDR AVIF)", "Couldn't open the editor: {e}": "Не удалось открыть редактор: {e}", "Create {n} Virtual Copies": "Создать виртуальные копии: {n}", @@ -51,6 +52,7 @@ "Done ({what}): {done} photo{plural}": "Готово ({what}): фото: {done}{plural:.0}", "Duplicate \"{label}\"": "Дублировать «{label}»", "Example: {example}": "Пример: {example}", + "Expand {name}": "Развернуть: {name}", "Exported {n} photo{}": "Экспортировано фото: {n}{:.0}", "Exported {ok} of {total} photo{}": "Экспортировано фото: {ok} из {total}{:.0}", "Exported {} point curve preset{}": "Экспортировано пресетов точечной кривой: {}{:.0}", diff --git a/crates/ui-egui/locales/ru.json b/crates/ui-egui/locales/ru.json index 306804df0..625277f38 100644 --- a/crates/ui-egui/locales/ru.json +++ b/crates/ui-egui/locales/ru.json @@ -1783,7 +1783,6 @@ "Click to clear these filters": "Щёлкните, чтобы сбросить эти фильтры", "Click to restore · double-click to rename": "Щёлкните, чтобы восстановить · двойной щелчок переименовывает", "Cmd+Shift+R, keeps the photo and clears its edits.)": "Cmd+Shift+R, сохраняет фото и сбрасывает его правки.)", - "Collapse": "Свернуть", "Collapse Stack": "Свернуть стопку", "Colors": "Цвета", "Colour-label filter with several labels at once; expandable folder tree in Local.": "Фильтр по цветовым меткам с несколькими метками сразу; раскрывающееся дерево папок в «Локальном».", diff --git a/crates/ui-egui/locales/sv-formats.json b/crates/ui-egui/locales/sv-formats.json index 9a71a0288..c99fbf871 100644 --- a/crates/ui-egui/locales/sv-formats.json +++ b/crates/ui-egui/locales/sv-formats.json @@ -52,6 +52,7 @@ "Build Standard-Sized Previews ({scope})": "Bygg förhandsgranskningar i standardstorlek ({scope})", "Building previews for {} photos…": "Bygger förhandsgranskningar för {} foton…", "Click {}:1": "Klick {}:1", + "Collapse {name}": "Komprimera {name}", "Couldn't open the editor: {e}": "Kunde inte öppna redigeraren: {e}", "Create Keyword Tag Inside “{name}”…": "Skapa nyckelordstagg i ”{name}”…", "Create the keyword “{name}”": "Skapa nyckelordet ”{name}”", @@ -74,6 +75,7 @@ "Duplicate \"{label}\"": "Duplicera ”{label}”", "Effect: {name}": "Effekt: {name}", "Example: {example}": "Exempel: {example}", + "Expand {name}": "Expandera {name}", "Exported to {path}": "Exporterade till {path}", "Exported {n} keyword{}": "Exporterade {n} nyckelord{}", "Exported {n} photo{}": "Exporterade {n} foto{}", diff --git a/crates/ui-egui/locales/sv.json b/crates/ui-egui/locales/sv.json index 66e69b7ba..af616b9d6 100644 --- a/crates/ui-egui/locales/sv.json +++ b/crates/ui-egui/locales/sv.json @@ -378,7 +378,6 @@ "Close Window": "Stäng fönster", "Cloudy": "Molnigt", "Cmd+Shift+R, keeps the photo and clears its edits.)": "Cmd+Shift+R, behåller fotot och rensar dess redigeringar.)", - "Collapse": "Komprimera", "Collapse All Stacks": "Komprimera alla staplar", "Collapse Stack": "Komprimera stapel", "Color": "Färg", diff --git a/crates/ui-egui/locales/uk-formats.json b/crates/ui-egui/locales/uk-formats.json index 36022ac1a..926af362f 100644 --- a/crates/ui-egui/locales/uk-formats.json +++ b/crates/ui-egui/locales/uk-formats.json @@ -36,6 +36,7 @@ "Build Standard-Sized Previews ({scope})": "Створити перегляди стандартного розміру ({scope})", "Building previews for {} photos…": "Створення переглядів для фото: {}…", "Click {}:1": "Клацання {}:1", + "Collapse {name}": "Згорнути: {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Колірний простір: Rec. 2020 {curve} (HDR AVIF)", "Couldn't open the editor: {e}": "Не вдалося відкрити редактор: {e}", "Create {n} Virtual Copies": "Створити віртуальні копії: {n}", @@ -49,6 +50,7 @@ "Done ({what}): {done} photo{plural}": "Готово ({what}): фото: {done}{plural:.0}", "Duplicate \"{label}\"": "Дублювати «{label}»", "Example: {example}": "Приклад: {example}", + "Expand {name}": "Розгорнути: {name}", "Exported {n} photo{}": "Експортовано фото: {n}{:.0}", "Exported {ok} of {total} photo{}": "Експортовано фото: {ok} із {total}{:.0}", "Exported {} point curve preset{}": "Експортовано наборів налаштувань точкової кривої: {}{:.0}", diff --git a/crates/ui-egui/locales/uk.json b/crates/ui-egui/locales/uk.json index ee694ed4f..c52d17027 100644 --- a/crates/ui-egui/locales/uk.json +++ b/crates/ui-egui/locales/uk.json @@ -355,7 +355,6 @@ "Revert": "Повернути до збереженого", "Print…": "Друк…", "Find…": "Знайти…", - "Collapse": "Згорнути", "Expand": "Розгорнути", "Speed": "Швидкість", " (library default)": " (типове для бібліотеки)", diff --git a/crates/ui-egui/locales/vi-formats.json b/crates/ui-egui/locales/vi-formats.json index d5e28bff0..b801b2f56 100644 --- a/crates/ui-egui/locales/vi-formats.json +++ b/crates/ui-egui/locales/vi-formats.json @@ -53,6 +53,7 @@ "Build Standard-Sized Previews ({scope})": "Tạo xem trước cỡ chuẩn ({scope})", "Building previews for {} photos…": "Đang tạo xem trước cho {} ảnh…", "Click {}:1": "Nhấp {}:1", + "Collapse {name}": "Thu gọn {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "Color space: Rec. 2020 {curve} (HDR AVIF)", "Couldn't open the editor: {e}": "Không thể mở trình chỉnh sửa: {e}", "Create Keyword Tag Inside “{name}”…": "Tạo từ khóa trong «{name}»…", @@ -76,6 +77,7 @@ "Duplicate \"{label}\"": "Nhân bản «{label}»", "Effect: {name}": "Effect: {name}", "Example: {example}": "Ví dụ: {example}", + "Expand {name}": "Mở rộng {name}", "Exported to {path}": "Exported to {path}", "Exported {n} keyword{}": "Đã xuất {n} từ khóa{:.0}", "Exported {n} photo{}": "Đã xuất {n} ảnh{:.0}", diff --git a/crates/ui-egui/locales/vi.json b/crates/ui-egui/locales/vi.json index e4fb8feb8..3f3203ac6 100644 --- a/crates/ui-egui/locales/vi.json +++ b/crates/ui-egui/locales/vi.json @@ -317,7 +317,6 @@ "Close panel": "Đóng bảng", "Cloudy": "Nhiều mây", "Cmd+Shift+R, keeps the photo and clears its edits.)": "Cmd+Shift+R, giữ ảnh và xóa chỉnh sửa.)", - "Collapse": "Thu gọn", "Collapse All Stacks": "Thu gọn mọi chồng", "Collapse Stack": "Thu gọn chồng", "Color": "Màu", diff --git a/crates/ui-egui/locales/zh-hans-formats.json b/crates/ui-egui/locales/zh-hans-formats.json index 7406c39b8..6b1d4fa3f 100644 --- a/crates/ui-egui/locales/zh-hans-formats.json +++ b/crates/ui-egui/locales/zh-hans-formats.json @@ -17,6 +17,7 @@ "Auto Sync: edits apply to {n} photos": "自动同步:编辑将应用到 {n} 张照片", "Automatic ({} MB)": "自动({0} MB)", "Click {}:1": "单击 {0}:1", + "Collapse {name}": "折叠 {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "色彩空间:Rec. 2020 {curve}(HDR AVIF)", "Create {n} Virtual Copies": "创建 {n} 个虚拟副本", "Decoder: {reason}": "解码器:{reason}", @@ -26,6 +27,7 @@ "Delete “{current}”": "删除“{current}”", "Duplicate \"{label}\"": "复制 \"{label}\"", "Example: {example}": "示例:{example}", + "Expand {name}": "展开 {name}", "Exported {n} photo{}": "已导出 {n} 张照片{0:.0}", "Exported {ok} of {total} photo{}": "已导出 {total} 张中的 {ok} 张照片{0:.0}", "Exported {} point curve preset{}": "已导出 {0} 个点曲线预设{1:.0}", diff --git a/crates/ui-egui/locales/zh-hans.json b/crates/ui-egui/locales/zh-hans.json index 270af8a62..ead5cf775 100644 --- a/crates/ui-egui/locales/zh-hans.json +++ b/crates/ui-egui/locales/zh-hans.json @@ -1684,7 +1684,6 @@ "Moves the photos imported from this folder to Recently Deleted; no file is touched": "将从此文件夹导入的照片移到“最近删除”;不会改动任何文件", "Remove Disk from Library…": "从图库中移除磁盘…", "Moves every photo imported from this disk to Recently Deleted; no file is touched": "将从此磁盘导入的所有照片移到“最近删除”;不会改动任何文件", - "Collapse": "折叠", "Expand": "展开", "Remove Disk from Library": "从图库中移除磁盘", "All the photos imported from this disk are included.": "包括从此磁盘导入的所有照片。", diff --git a/crates/ui-egui/locales/zh-hant-formats.json b/crates/ui-egui/locales/zh-hant-formats.json index d5c4eb279..366a8657f 100644 --- a/crates/ui-egui/locales/zh-hant-formats.json +++ b/crates/ui-egui/locales/zh-hant-formats.json @@ -22,6 +22,7 @@ "Build Smart Previews ({scope})": "建立智慧型預覽({scope})", "Build Standard-Sized Previews ({scope})": "建立標準尺寸預覽({scope})", "Click {}:1": "點擊時 {}:1", + "Collapse {name}": "收合 {name}", "Color space: Rec. 2020 {curve} (HDR AVIF)": "色彩空間:Rec. 2020 {curve}(HDR AVIF)", "Create {n} Virtual Copies": "建立 {n} 張虛擬副本", "Decoder: {reason}": "解碼器:{reason}", @@ -32,6 +33,7 @@ "Discard Smart Previews ({scope})": "捨棄智慧型預覽({scope})", "Duplicate \"{label}\"": "複製「{label}」", "Example: {example}": "範例:{example}", + "Expand {name}": "展開 {name}", "Exported {n} photo{}": "已匯出 {n} 張照片{:.0}", "Exported {ok} of {total} photo{}": "已匯出 {ok}/{total} 張照片{:.0}", "Exported {} point curve preset{}": "已匯出 {} 個點曲線預設集{:.0}", diff --git a/crates/ui-egui/locales/zh-hant.json b/crates/ui-egui/locales/zh-hant.json index 0408e23ec..0a2b07831 100644 --- a/crates/ui-egui/locales/zh-hant.json +++ b/crates/ui-egui/locales/zh-hant.json @@ -1690,7 +1690,6 @@ "Moves the photos imported from this folder to Recently Deleted; no file is touched": "將從此資料夾匯入的照片移至「最近刪除」;不會更動任何檔案", "Remove Disk from Library…": "從照片庫移除磁碟…", "Moves every photo imported from this disk to Recently Deleted; no file is touched": "將從此磁碟匯入的所有照片移至「最近刪除」;不會更動任何檔案", - "Collapse": "收合", "Expand": "展開", "Remove Disk from Library": "從照片庫移除磁碟", "All the photos imported from this disk are included.": "包含從此磁碟匯入的所有照片。", diff --git a/crates/ui-egui/src/panels/keyword_list.rs b/crates/ui-egui/src/panels/keyword_list.rs index ba31c6676..043f19eaf 100644 --- a/crates/ui-egui/src/panels/keyword_list.rs +++ b/crates/ui-egui/src/panels/keyword_list.rs @@ -189,7 +189,7 @@ fn row(app: &mut LightcraftApp, ui: &mut egui::Ui, r: &Row, selection: &[PhotoId let c = pos2(x + 6.0, cy); let tri = Rect::from_center_size(c, vec2(16.0, 16.0)); let tr = ui.interact(tri, egui::Id::unique(("keyword-list-tri", r.path.to_lowercase())), Sense::click()); - crate::widgets::announce(&tr, crate::i18n::tr(if r.open { "Collapse" } else { "Expand" })); + crate::widgets::announce(&tr, super::left::disclosure_name(r.open, &r.name)); register(ui, format!("keywordRowToggle:{}", r.path), tri); // while a filter opens the levels the triangle does nothing: it doesn't light up either let lit = tr.hovered() && can_fold; diff --git a/crates/ui-egui/src/panels/left.rs b/crates/ui-egui/src/panels/left.rs index 27b86aa0d..8aea4f9d0 100644 --- a/crates/ui-egui/src/panels/left.rs +++ b/crates/ui-egui/src/panels/left.rs @@ -28,6 +28,7 @@ use folders::{folder_rows, reveal_chosen}; use keywords::keyword_rows; pub(crate) use local::{fs_cached, fs_cached_running, same_folder}; use local::{local_now, local_rows}; +pub(crate) use rows::disclosure_name; #[cfg(test)] pub(crate) use rows::{INDENT_STEP, MIN_INDENT_STEP}; use rows::{LIBFOLDER_REVEALED, Row, SCROLL_TO_ROW, set_tree_open}; diff --git a/crates/ui-egui/src/panels/left/albums.rs b/crates/ui-egui/src/panels/left/albums.rs index 92498eb02..a4c504627 100644 --- a/crates/ui-egui/src/panels/left/albums.rs +++ b/crates/ui-egui/src/panels/left/albums.rs @@ -47,7 +47,7 @@ fn albums_tree(app: &mut LightcraftApp, ui: &mut egui::Ui, all: &AlbumKids, pare let draw_open = open; let mut toggled = false; if has_children { - let tri = tree_toggle(ui, &resp, indent, open_id, &mut open, format!("albumToggle:{}", a.id.0)); + let tri = tree_toggle(ui, &resp, indent, open_id, &mut open, format!("albumToggle:{}", a.id.0), &a.name); toggled = tri.clicked(); // the triangle sits on the row and takes its clicks: the menu opens from it too folder_menu(app, &tri, a); diff --git a/crates/ui-egui/src/panels/left/dates.rs b/crates/ui-egui/src/panels/left/dates.rs index 2971cb2f4..8b91379f8 100644 --- a/crates/ui-egui/src/panels/left/dates.rs +++ b/crates/ui-egui/src/panels/left/dates.rs @@ -26,7 +26,7 @@ fn date_row(app: &mut LightcraftApp, ui: &mut egui::Ui, key: &str, label: &str, let sel = app.session.filter.date.as_deref() == Some(key); let resp = Row::new(&format!("date:{key}"), Icon::Clock, label).count(Some(count)).selected(sel).indent(indent).show(app, ui); if key.len() < 10 { - tree_toggle(ui, &resp, indent, open_id, &mut open, format!("dateToggle:{key}")); + tree_toggle(ui, &resp, indent, open_id, &mut open, format!("dateToggle:{key}"), label); } if resp.clicked() { let v = if sel { serde_json::Value::Null } else { json!(key) }; diff --git a/crates/ui-egui/src/panels/left/folders.rs b/crates/ui-egui/src/panels/left/folders.rs index 20c1bbce1..040d9c02d 100644 --- a/crates/ui-egui/src/panels/left/folders.rs +++ b/crates/ui-egui/src/panels/left/folders.rs @@ -40,7 +40,7 @@ pub(super) fn folder_tree( // at the tree's own indent, as in Albums and Folders: the triangle sits in the gutter and the // icon lines up with the rows above let resp = Row::new(&format!("local:{path}"), Icon::Folder, name).selected(sel).indent(indent).show(app, ui).on_hover_text(path); - let tr = tree_toggle(ui, &resp, indent, open_id, &mut open, format!("folderToggle:{path}")); + let tr = tree_toggle(ui, &resp, indent, open_id, &mut open, format!("folderToggle:{path}"), name); if !tr.clicked() && resp.clicked() && let Err(e) = app.run("library.browse", json!({"path": path})) @@ -345,7 +345,7 @@ fn folder_row(app: &mut LightcraftApp, ui: &mut egui::Ui, n: &FolderNode, id: &s folder_drop_target(app, ui, &resp, n, open_id, open); let mut toggled = false; if !n.children.is_empty() { - let tr = tree_toggle(ui, &resp, indent, open_id, open, format!("libraryFolderToggle:{}", n.path)); + let tr = tree_toggle(ui, &resp, indent, open_id, open, format!("libraryFolderToggle:{}", n.path), name); toggled = tr.clicked(); // the triangle sits on the row and takes its clicks: the menu opens from it too row_menu(app, &tr, n); diff --git a/crates/ui-egui/src/panels/left/keywords.rs b/crates/ui-egui/src/panels/left/keywords.rs index d8e1720a9..2ec3569fa 100644 --- a/crates/ui-egui/src/panels/left/keywords.rs +++ b/crates/ui-egui/src/panels/left/keywords.rs @@ -25,7 +25,7 @@ fn keyword_row(app: &mut LightcraftApp, ui: &mut egui::Ui, n: &KeywordNode, id: let sel = app.session.filter.keyword.as_deref().is_some_and(|k| k.eq_ignore_ascii_case(&n.path)); let resp = Row::new(id, Icon::Tag, &n.name).count(Some(n.count)).selected(sel).indent(indent).show(app, ui); if let Some(k) = open_id { - tree_toggle(ui, &resp, indent, k, open, format!("keywordToggle:{}", n.path)); + tree_toggle(ui, &resp, indent, k, open, format!("keywordToggle:{}", n.path), &n.name); } let resp = resp.on_hover_text(if n.children.is_empty() { n.path.clone() } else { format!("{} (includes the keywords below it)", n.path) }); if resp.clicked() { diff --git a/crates/ui-egui/src/panels/left/rows.rs b/crates/ui-egui/src/panels/left/rows.rs index ac364aa36..76d983845 100644 --- a/crates/ui-egui/src/panels/left/rows.rs +++ b/crates/ui-egui/src/panels/left/rows.rs @@ -246,6 +246,11 @@ fn disclosure_chevron(ui: &mut egui::Ui, row: &egui::Response, indent: f32, open tr } +/// What a disclosure triangle is called: "Expand Travel" / "Collapse Travel". +pub(crate) fn disclosure_name(open: bool, name: &str) -> String { + if open { crate::i18n::tr_format!("Collapse {name}", name = name) } else { crate::i18n::tr_format!("Expand {name}", name = name) } +} + /// Whether the tree row `key` is open: what the user last chose this session, else `default`. pub(super) fn tree_open(ui: &egui::Ui, key: egui::Id, default: bool) -> bool { ui.data(|d| d.get_temp(key)).unwrap_or(default) @@ -259,13 +264,22 @@ pub(super) fn set_tree_open(ui: &egui::Ui, key: egui::Id, open: bool) { /// The chevron of a tree row that has rows inside it (Albums' folders, Local, By Date, Folders, /// Keywords): a click flips `open` and remembers it under `key`. Returns the chevron's response /// (it sits on the row and takes its clicks, so a row's context menu is attached to it too). -pub(super) fn tree_toggle(ui: &mut egui::Ui, row: &egui::Response, indent: f32, key: egui::Id, open: &mut bool, widget: String) -> egui::Response { +pub(super) fn tree_toggle( + ui: &mut egui::Ui, + row: &egui::Response, + indent: f32, + key: egui::Id, + open: &mut bool, + widget: String, + name: &str, +) -> egui::Response { let tri = disclosure_chevron(ui, row, indent, *open, key.with("triangle"), widget); if tri.clicked() { *open = !*open; set_tree_open(ui, key, *open); } - let label = if *open { crate::i18n::tr("Collapse") } else { crate::i18n::tr("Expand") }; - tri.widget_info(|| egui::WidgetInfo::labeled(egui::Role::Button, true, label)); + // (the name of the row it opens: a screen reader lists the triangles one after another) + let label = disclosure_name(*open, name); + tri.widget_info(|| egui::WidgetInfo::labeled(egui::Role::Button, true, label.clone())); tri } diff --git a/crates/ui-egui/tests/it/main.rs b/crates/ui-egui/tests/it/main.rs index 4b9fa7eb7..a73e24fc4 100644 --- a/crates/ui-egui/tests/it/main.rs +++ b/crates/ui-egui/tests/it/main.rs @@ -3,3 +3,4 @@ mod accessibility; mod docking_workflows; +mod sidebar_names; diff --git a/crates/ui-egui/tests/it/sidebar_names.rs b/crates/ui-egui/tests/it/sidebar_names.rs new file mode 100644 index 000000000..d2c288aaa --- /dev/null +++ b/crates/ui-egui/tests/it/sidebar_names.rs @@ -0,0 +1,39 @@ +//! What a screen reader is told about the sidebar's disclosure triangles: each names the row it +//! opens or closes, so a list of them is not "Expand, Expand, Expand". +use egui::accesskit::Role; +use egui::vec2; +use egui_kittest::{Harness, kittest::NodeT}; +use lightcraft_ui_egui::{ + LightcraftApp, Services, + state::{RightPanel, ViewMode}, +}; + +fn sidebar() -> Harness<'static, LightcraftApp> { + let mut app = LightcraftApp::new(lightcraft_engine::Session::with_demo(), Services { png: None, ..Default::default() }); + app.ui.left_panel = true; + app.ui.view = ViewMode::PhotoGrid; + app.ui.right = RightPanel::None; + let mut h = Harness::builder().with_size(vec2(1500.0, 950.0)).build_ui_state( + |ui, app: &mut LightcraftApp| { + app.logic(&ui.ctx().clone()); + app.ui(ui); + }, + app, + ); + h.run_steps(10); + h +} + +fn button_names(h: &Harness<'_, LightcraftApp>) -> Vec { + h.root().children_recursive().filter(|n| n.accesskit_node().role() == Role::Button).filter_map(|n| n.accesskit_node().label()).collect() +} + +#[test] +fn a_disclosure_triangle_names_its_row() { + let h = sidebar(); + let names = button_names(&h); + // the demo library's album folder is open, with albums inside it; By Date is closed + assert!(names.iter().any(|n| n == "Collapse Travel 2026"), "the open album folder's triangle: {names:?}"); + assert!(names.iter().any(|n| n == "Expand 2026"), "By Date's year: {names:?}"); + assert!(!names.iter().any(|n| n == "Expand" || n == "Collapse"), "no triangle is just a verb: {names:?}"); +} diff --git a/docs/parity-checklist.md b/docs/parity-checklist.md index 90cfc248f..a23476f07 100644 --- a/docs/parity-checklist.md +++ b/docs/parity-checklist.md @@ -1,6 +1,6 @@ # Lightroom parity checklist -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-25 · **Change:** minor (LR-BEHAV-TITLEBAR: a double-click follows the system setting, and a panel over the bar keeps the window still; KEYC-METADATA, LRC-LIB-KEYWORDS: ⌥0 / ⌥⇧0 go to the next / previous keyword set; LRC-DEV-HISTOGRAM-DRAG: the histogram's five tonal zones — hover for the value, drag to adjust the Basic control the press locked, double-click to reset; LR-VIEW-HISTOGRAM note updated; MENU-BAR: on macOS a menu item that yields its key to a focused text field or to shortcut recording really lets it go; LR-MERGE-HDR / LR-MERGE-PANO: Lanczos-3 warps; LR-IMP-LOCAL: browsing from the sidebar records the folder; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LR-IMP-ADD-DIALOG: hierarchical import album destination reconciled with main, #2362; KEY-SLIDER-NUDGE: vertical wheel nudges need a click or drag in the row; leaving it disarms them; LR-EDIT-OPTICS-PROFILE: Fujifilm nine-knot lens tables read at the plain radius; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LRC-LIB-LIBFOLDERS, LR-BEHAV-BG-TASKS: Synchronize Folder's scan shows its folder listing and stops it on ✕; LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date; LR-LIB-STACK: filmstrip stack badge click; LRC-LIB-REFVIEW / CATALOG-SWITCH: Escape preserves edits; catalog-local pins; deleted and malformed references refused; LRC-LIB-COMPARE: the Info panel labels the active photo while culling, #2398; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched, not the whole list; earlier: LRC-PRINT-PAGE: Print Page Options; LR-META-XMP: fewer false unimported-XMP warnings; KEYC-METADATA: ⌘K / Ctrl+K Add Keywords; LRC-DEV-HISTOGRAM-DRAG: the histogram's five tonal zones — hover for the value, drag to adjust the Basic control the press locked, double-click to reset; LR-VIEW-HISTOGRAM note updated; MENU-BAR: on macOS a menu item that yields its key to a focused text field or to shortcut recording really lets it go; LR-MERGE-HDR / LR-MERGE-PANO: Lanczos-3 warps; LR-IMP-LOCAL: browsing from the sidebar records the folder; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LR-IMP-ADD-DIALOG: hierarchical import album destination reconciled with main, #2362; KEY-SLIDER-NUDGE: vertical wheel nudges need a click or drag in the row; leaving it disarms them; LR-EDIT-OPTICS-PROFILE: Fujifilm nine-knot lens tables read at the plain radius; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LRC-LIB-LIBFOLDERS, LR-BEHAV-BG-TASKS: Synchronize Folder's scan shows its folder listing and stops it on ✕; LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date; LR-LIB-STACK: filmstrip stack badge click; LRC-LIB-REFVIEW / CATALOG-SWITCH: Escape preserves edits; catalog-local pins; deleted and malformed references refused; LRC-LIB-COMPARE: the Info panel labels the active photo while culling, #2398; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched, not the whole list; earlier: LRC-PRINT-PAGE: Print Page Options; LR-META-XMP: fewer false unimported-XMP warnings) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-27 · **Change:** minor (LR-BEHAV-ACCESS: the sidebar's disclosure triangles name their row; LR-BEHAV-TITLEBAR: a double-click follows the system setting, and a panel over the bar keeps the window still; KEYC-METADATA, LRC-LIB-KEYWORDS: ⌥0 / ⌥⇧0 go to the next / previous keyword set; LRC-DEV-HISTOGRAM-DRAG: the histogram's five tonal zones — hover for the value, drag to adjust the Basic control the press locked, double-click to reset; LR-VIEW-HISTOGRAM note updated; MENU-BAR: on macOS a menu item that yields its key to a focused text field or to shortcut recording really lets it go; LR-MERGE-HDR / LR-MERGE-PANO: Lanczos-3 warps; LR-IMP-LOCAL: browsing from the sidebar records the folder; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LR-IMP-ADD-DIALOG: hierarchical import album destination reconciled with main, #2362; KEY-SLIDER-NUDGE: vertical wheel nudges need a click or drag in the row; leaving it disarms them; LR-EDIT-OPTICS-PROFILE: Fujifilm nine-knot lens tables read at the plain radius; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LRC-LIB-LIBFOLDERS, LR-BEHAV-BG-TASKS: Synchronize Folder's scan shows its folder listing and stops it on ✕; LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date; LR-LIB-STACK: filmstrip stack badge click; LRC-LIB-REFVIEW / CATALOG-SWITCH: Escape preserves edits; catalog-local pins; deleted and malformed references refused; LRC-LIB-COMPARE: the Info panel labels the active photo while culling, #2398; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched, not the whole list; earlier: LRC-PRINT-PAGE: Print Page Options; LR-META-XMP: fewer false unimported-XMP warnings; KEYC-METADATA: ⌘K / Ctrl+K Add Keywords; LRC-DEV-HISTOGRAM-DRAG: the histogram's five tonal zones — hover for the value, drag to adjust the Basic control the press locked, double-click to reset; LR-VIEW-HISTOGRAM note updated; MENU-BAR: on macOS a menu item that yields its key to a focused text field or to shortcut recording really lets it go; LR-MERGE-HDR / LR-MERGE-PANO: Lanczos-3 warps; LR-IMP-LOCAL: browsing from the sidebar records the folder; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LR-IMP-ADD-DIALOG: hierarchical import album destination reconciled with main, #2362; KEY-SLIDER-NUDGE: vertical wheel nudges need a click or drag in the row; leaving it disarms them; LR-EDIT-OPTICS-PROFILE: Fujifilm nine-knot lens tables read at the plain radius; LR-VIEW-ZOOM: only a full-size drag within 20 ms clears a slow-drag verdict; LRC-LIB-LIBFOLDERS, LR-BEHAV-BG-TASKS: Synchronize Folder's scan shows its folder listing and stops it on ✕; LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date; LR-LIB-STACK: filmstrip stack badge click; LRC-LIB-REFVIEW / CATALOG-SWITCH: Escape preserves edits; catalog-local pins; deleted and malformed references refused; LRC-LIB-COMPARE: the Info panel labels the active photo while culling, #2398; KEYC-RATING: `\` shows / hides the Filter Bar in the grids; LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched, not the whole list; earlier: LRC-PRINT-PAGE: Print Page Options; LR-META-XMP: fewer false unimported-XMP warnings) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6 The measured, row-by-row checklist: one row per Lightroom feature, menu item and shortcut, what we have and what is missing. It answers *does the feature exist?* (feature breadth). Whether it is good @@ -479,7 +479,7 @@ differences and missing bindings are in [ui-parity.md](ui-parity.md#shortcuts). | LR-BEHAV-TOOLTIPS | Tooltips with shortcuts | P0 | ✅ | `crates/ui-egui/src/panels/bottombar.rs` | | | LR-BEHAV-TEXTFIELD | Text fields behave alike | P1 | 🟡 | `crates/ui-egui/src/widgets/text_field.rs`, `crates/ui-egui/src/panels/topbar.rs`, `crates/ui-egui/src/widgets.rs`, `crates/ui-egui/src/panels/right.rs` (`meta_field`), `crates/ui-egui/src/dialogs.rs`, `crates/ui-egui/src/panels/unnamed.rs` | one shared field: right-click Cut / Copy / Paste / Select All (no Paste in the browser), Esc gives back the text from before the edit, Return / leaving / Esc reported to the caller, optional select-on-focus; agents use `ui.clipboard` (MCP `clipboard`) and `ui.inspect` → `copied`. Used by Search Photos, slider values, the Info panel's metadata fields (multi-line captions), the one-field dialogs (New / Rename Album, New Smart Album, Rename / Merge Keywords, text prompts) and the unnamed faces' name field so far; the other text fields (most dialogs, import, settings, masking, keywords …) still use egui's own and have no menu | | LR-BEHAV-HEADLESS | Headless UI snapshots | P2 | ✅ | `apps/lightcraft-cli/src/main.rs`, `crates/ui-egui/src/headless.rs`, `docs/control-protocol.md` | `snapshot` rasterizes the UI and defaults photo development to the CPU before the first frame, without adapter discovery; scaled dimensions are validated before allocation, and UI zoom preserves the requested physical viewport; JSON-lines control scripts are supported | -| LR-BEHAV-ACCESS | Accessibility | P2 | 🟡 | `crates/ui-egui/src/widgets.rs`, `crates/ui-egui/src/widgets/text_field.rs`, `crates/ui-egui/src/panels/grid.rs`, `crates/ui-egui/tests/it/accessibility.rs` | AccessKit (VoiceOver / Narrator / AT-SPI): sliders announce control, value, range and step and take Increment / Decrement, buttons / icon buttons / dropdowns / section headers / sources their labels and state, text fields their caption, grid thumbnails file name, rating, flag and label. `tests/it/accessibility.rs` fails on an unnamed control, a slider without range or an untitled dialog in every view, Develop tool and 13 dialogs, and checks that Crop and Remove sliders are reached with Tab and that Tab walks the right panels top to bottom. Canvas tools by keyboard (`crates/ui-egui/src/canvas_keys.rs`, `crates/ui-egui/src/tests/canvas_keys.rs`): crop corners, edges and box, spot targets and sources, a New spot point (Return adds), radial / linear gradient handles and mask pins take the focus, are announced with their position and move with the arrows (Shift: further). Dialogs with one name field (New Album, New Smart Album, Save Metadata Preset, the renames) take the focus once when they open, so Tab and Shift+Tab reach their check box, Cancel and OK, and Return and Esc still confirm and cancel (`crates/ui-egui/src/tests/dialog_tab.rs`). Brush strokes and red-eye ellipses are pointer-only; not tried with a real screen reader ([audit](ui-parity.md#accessibility-audit)) | +| LR-BEHAV-ACCESS | Accessibility | P2 | 🟡 | `crates/ui-egui/src/widgets.rs`, `crates/ui-egui/src/widgets/text_field.rs`, `crates/ui-egui/src/panels/grid.rs`, `crates/ui-egui/tests/it/accessibility.rs` | AccessKit (VoiceOver / Narrator / AT-SPI): sliders announce control, value, range and step and take Increment / Decrement, buttons / icon buttons / dropdowns / section headers / sources their labels and state, text fields their caption, grid thumbnails file name, rating, flag and label. `tests/it/accessibility.rs` fails on an unnamed control, a slider without range or an untitled dialog in every view, Develop tool and 13 dialogs, and checks that Crop and Remove sliders are reached with Tab and that Tab walks the right panels top to bottom. Canvas tools by keyboard (`crates/ui-egui/src/canvas_keys.rs`, `crates/ui-egui/src/tests/canvas_keys.rs`): crop corners, edges and box, spot targets and sources, a New spot point (Return adds), radial / linear gradient handles and mask pins take the focus, are announced with their position and move with the arrows (Shift: further). Dialogs with one name field (New Album, New Smart Album, Save Metadata Preset, the renames) take the focus once when they open, so Tab and Shift+Tab reach their check box, Cancel and OK, and Return and Esc still confirm and cancel (`crates/ui-egui/src/tests/dialog_tab.rs`). Brush strokes and red-eye ellipses are pointer-only; not tried with a real screen reader ([audit](ui-parity.md#accessibility-audit)). The sidebar's and the keyword list's disclosure triangles say which row they open or close, as "Expand Travel" (`crates/ui-egui/tests/it/sidebar_names.rs`). | | LR-BEHAV-LOCALE | Language options | P2 | ✅ | `cmd:app.language.english`, `cmd:app.language.simplifiedChinese`, `cmd:app.language.traditionalChinese`, `cmd:app.language.japanese`, `cmd:app.language.portuguese`, `cmd:app.language.french`, `cmd:app.language.spanish`, `cmd:app.language.german`, `cmd:app.language.russian`, `cmd:app.language.ukrainian`, `cmd:app.language.georgian`, `cmd:app.language.polish`, `cmd:app.language.czech`, `cmd:app.language.italian`, `cmd:app.language.swedish`, `cmd:app.language.finnish`, `cmd:app.language.indonesian`, `cmd:app.language.vietnamese` | Edit > Language lists every language in the table and the active one is checked; shared with Settings > General (docs/localization.md) | | LR-BEHAV-LOCALIZE | Localisation | P2 | 🟡 | `crates/ui-egui/src/i18n.rs`, `crates/ui-egui/locales/`, `docs/localization.md`, `docs/localization-zh-hans.md`, `docs/localization-zh-hant.md`, `docs/localization-ja.md`, `docs/localization-pt-br.md`, `docs/localization-es.md`, `docs/localization-de.md`, `docs/localization-ru.md`, `docs/localization-ka.md`, `docs/localization-pl.md` | One table entry per language (code, endonym, ISO 15924 script, catalog): English, Simplified Chinese, Traditional Chinese (Taiwan), Japanese, Brazilian Portuguese, Spanish, German, Russian, French, Ukrainian, Polish, Czech, Italian, Georgian, Swedish, Finnish, Indonesian and Vietnamese UI with a persisted language preference and craft-fonts regular/bold faces per script (a variable face, as for Arabic, is drawn heavier for bold from its one file); menus, edit, crop/masks, settings, import/export and primary progress messages. Adding a language registers the locale and its language command, plus two catalogs. Stock presets/profiles, history steps, library headings, date headings and capture times are localised (user-named items stay verbatim); the Ukrainian catalog covers every existing catalog key, command/control label and rule-editor label; the German catalog reports newly added gaps; the other catalogs fall back to English for messages they lack. Technical errors remain English; release notes are translated in German and Ukrainian; craft-fonts faces for other scripts (Thai, Arabic, …) are UI fallbacks in every language, for file, folder and album names (#736); Traditional Chinese borrows the Simplified Chinese face (no TC face in craft-fonts yet), and the web build embeds the Japanese, Thai and Georgian faces in WASM while loading the Simplified Chinese face from a separate font file. | | LR-BEHAV-LEARN | Tutorials | OOS | 🚫 | | | @@ -959,3 +959,4 @@ Latin stays upright. Advanced Japanese composition remains open. Regression cove | 2026-10-23 | patch | LR-BEHAV-ACCESS: the name field of New Album, New Smart Album, Rename and the other one-field dialogs takes the keyboard focus once when the dialog opens instead of every frame, so Tab and Shift+Tab reach the check box, Cancel and OK; status unchanged (🟡) | | 2026-10-22 | minor | LR-CROP-AUTO: Auto straighten turns by at most 10° and only on at least 3 agreeing lines, and says when it finds nothing to level by; measured on 68 photos straightened by hand and 300 left as shot, unwanted turns of more than 1° fell from 79 to 19 of the 300. Downgraded ✅ → 🟡: it still leaves most tilted photos alone | | 2026-10-23 | patch | LRC-LIB-FILTERBAR: showing an album (`library.source`) while the filter holds an album drops the filter's album, as showing a library folder already dropped its folder filter; before, the old album stayed in the filter unseen (the filter bar has no album chip) and narrowed the next source such as All Photos; the row's note says so; status unchanged (✅) | +| 2026-10-27 | patch | LR-BEHAV-ACCESS: the sidebar's and the keyword list's disclosure triangles are named with their row ("Expand Travel"), not just "Expand" or "Collapse"; status stays 🟡 | diff --git a/docs/whats-new.md b/docs/whats-new.md index c6c259200..0b83a2b3a 100644 --- a/docs/whats-new.md +++ b/docs/whats-new.md @@ -1,5 +1,12 @@ # What's new in LightCraft +## 2026-10-27 + +### Screen readers name the sidebar's disclosure triangles +- Each triangle in the left sidebar (album folders, local folders, By Date, imported folders, keywords) and in the + keyword list now says which row it opens or closes: "Expand Travel", "Collapse 2026". They were all named just + "Expand" or "Collapse", so VoiceOver read a list of identical buttons. + ## 2026-10-24 ### Relative-date filters and smart albums follow the clock