Merge PR #3200: MENU-BAR: shortcuts list their modifiers in one order everywhere on macOS

Conflicts: docs/whats-new.md and docs/parity-checklist.md (both sides unioned), locales/ru.json (both keys kept)
This commit is contained in:
aiongg
2026-10-31 02:08:10 +00:00
45 changed files with 105 additions and 35 deletions
+1
View File
@@ -76,6 +76,7 @@
"Healed {n} dust spot{}": "Retušované prachové skvrny: {n}{:.0}",
"Import cancelled · {} photo{} added": "Import byl zrušen · přidáno fotografií: {}{:.0}",
"Import failed: {e}": "Import selhal: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Importujte fotografie přes Soubor → Importovat fotografie… ({}) nebo je přetáhněte sem",
"Import warnings ({n}):\n{warnings}": "Varování importu ({n}):\n{warnings}",
"Imported {n} point curve preset{}": "Importovaná přednastavení bodové křivky: {n}{:.0}",
"Imported {n} preset{}": "Importovaná přednastavení: {n}{:.0}",
+1 -1
View File
@@ -57,6 +57,7 @@
"Add to Local": "Přidat do místních souborů",
"Add to My Photos": "Přidat do mých fotografií",
"Can't be moved here": "Sem nelze přesunout",
"Import photos with File → Import Photos…, or drop them here": "Importujte fotografie přes Soubor → Importovat fotografie… nebo je přetáhněte sem",
"This row covers more than one disk: drop on a folder inside it": "Tento řádek zahrnuje více disků: přetáhněte položky na některou ze složek v něm",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "Místní fotografie zatím nejsou v knihovně: nejprve použijte Přidat do mých fotografií a pak je přesuňte",
"Add to My Photos First": "Nejprve přidat do mých fotografií",
@@ -904,7 +905,6 @@
"Import from Device": "Importovat ze zařízení",
"Import from Folder…": "Importovat ze složky…",
"Import new photos": "Importovat nové fotografie",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importujte fotografie přes Soubor → Importovat fotografie… (Cmd+Shift+I) nebo je přetáhněte sem",
"Imported": "Importováno",
"Imported Photos": "Importované fotografie",
"Importing": "Importování",
+1
View File
@@ -61,6 +61,7 @@
"Healed {n} dust spot{}": "Reparierte Staubflecken: {n}{:.0}",
"Import cancelled · {} photo{} added": "Import abgebrochen · {} Foto{} hinzugefügt",
"Import failed: {e}": "Import fehlgeschlagen: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Importiere Fotos über Datei → Fotos importieren… ({}) oder lege sie hier ab",
"Import warnings ({n}):\n{warnings}": "Importwarnungen ({n}):\n{warnings}",
"The XMP sidecars of {n} photos couldn't be written (is their folder offline?). LightCraft keeps trying.": "Die XMP-Begleitdateien von {n} Fotos konnten nicht geschrieben werden (ist ihr Ordner offline?). LightCraft versucht es weiter.",
"XMP profile \"{profile}\" was not applied for {path}; colors may differ from Lightroom.": "XMP-Profil „{profile}“ wurde für {path} nicht angewendet; Farben können von Lightroom abweichen.",
+1 -1
View File
@@ -57,6 +57,7 @@
"Add to Local": "Zu „Lokal“ hinzufügen",
"Add to My Photos": "Zu „Meine Fotos“ hinzufügen",
"Can't be moved here": "Hierher nicht verschiebbar",
"Import photos with File → Import Photos…, or drop them here": "Importiere Fotos über Datei → Fotos importieren… oder lege sie hier ab",
"This row covers more than one disk: drop on a folder inside it": "Diese Zeile umfasst mehr als ein Laufwerk: auf einem Ordner darin ablegen",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "Lokale Fotos sind noch nicht in der Bibliothek: erst zu „Meine Fotos“ hinzufügen, dann verschieben",
"Add to Selected Photos": "Zu ausgewählten Fotos hinzufügen",
@@ -713,7 +714,6 @@
"Import as new": "Neu importieren",
"Import from Device": "Von Gerät importieren",
"Import from Folder…": "Aus Ordner importieren…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importiere Fotos über Datei → Fotos importieren… (⌘⇧I) oder lege sie hier ab",
"Import presets from other editors: XMP presets, classic `.lrtemplate` files, \"DNG presets\" from mobile apps and `.zip`": "Vorgaben aus anderen Editoren importieren: XMP-Vorgaben, klassische `.lrtemplate`-Dateien, „DNG-Vorgaben“ aus mobilen Apps und `.zip`-Pakete.",
"Import ▸ Copy verifies every copy, like Move (issue #96): each file is written as a new file, synced to disk and": "Import → Kopieren prüft jede Kopie wie beim Verschieben (Issue #96): Jede Datei wird neu geschrieben, auf den Datenträger synchronisiert",
"Import ▸ Move: photos go into the destination (with the same folders and renaming as Copy, e.g.": "Import → Verschieben: Fotos gehen mit derselben Ordnerstruktur und Umbenennung wie beim Kopieren in den Zielordner, etwa",
+1
View File
@@ -61,6 +61,7 @@
"Healed {n} dust spot{}": "{n} mancha{0} de polvo corregida{0}",
"Import cancelled · {} photo{} added": "Importación cancelada · {0} foto{1} añadida{1}",
"Import failed: {e}": "Error de importación: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Importar fotos con Archivo → Importar fotos… ({}) o soltarlas aquí",
"Import warnings ({n}):\n{warnings}": "Avisos de importación ({n}):\n{warnings}",
"The XMP sidecars of {n} photos couldn't be written (is their folder offline?). LightCraft keeps trying.": "No se pudieron escribir los archivos XMP de {n} fotos (¿su carpeta está desconectada?). LightCraft lo sigue intentando.",
"XMP profile \"{profile}\" was not applied for {path}; colors may differ from Lightroom.": "El perfil XMP \"{profile}\" no se aplicó a {path}; los colores pueden diferir de Lightroom.",
+1 -1
View File
@@ -42,6 +42,7 @@
"Add to Local": "Añadir a Local",
"Add to My Photos": "Añadir a Mis fotos",
"Can't be moved here": "No se pueden mover aquí",
"Import photos with File → Import Photos…, or drop them here": "Importar fotos con Archivo → Importar fotos… o soltarlas aquí",
"This row covers more than one disk: drop on a folder inside it": "Esta fila abarca más de un disco: suéltalas en una carpeta dentro de ella",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "Las fotos locales aún no están en la biblioteca: primero Añadir a Mis fotos y luego muévelas",
"Add to Selected Photos": "Añadir a las fotos seleccionadas",
@@ -719,7 +720,6 @@
"Import as new": "Importar como nuevas",
"Import from Device": "Importar desde dispositivo",
"Import from Folder…": "Importar desde carpeta…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importar fotos con Archivo → Importar fotos… (Cmd+Mayús+I) o soltarlas aquí",
"Imported": "Importadas",
"Imported Photos": "Fotos importadas",
"Importing": "Importando",
+1
View File
@@ -92,6 +92,7 @@
"Healed {n} dust spot{}": "Korjattuja pölyhiukkasia: {n}{:.0}",
"Import cancelled · {} photo{} added": "Tuonti peruttu · lisättyjä kuvia: {}{:.0}",
"Import failed: {e}": "Tuonti epäonnistui: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Tuo kuvia valitsemalla Tiedosto → Tuo kuvia… ({}) tai pudota ne tähän",
"Import warnings ({n}):\n{warnings}": "Tuontivaroitukset ({n}):\n{warnings}",
"Imported {e} mask effect{} (Masking ▸ Effect)": "Tuotuja maskitehosteita: {e}{:.0} (Maskaus → Tehoste)",
"Imported {name}": "{name} tuotu",
+1 -1
View File
@@ -912,7 +912,7 @@
"Import from Folder…": "Tuo kansiosta…",
"Import new photos": "Tuo uudet kuvat",
"Import photos to get started": "Aloita tuomalla kuvia",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Tuo kuvia valitsemalla Tiedosto → Tuo kuvia… (Cmd+Shift+I) tai pudota ne tähän",
"Import photos with File → Import Photos…, or drop them here": "Tuo kuvia valitsemalla Tiedosto → Tuo kuvia… tai pudota ne tähän",
"Imported": "Tuotu",
"Imported Photos": "Tuodut kuvat",
"Importing": "Tuodaan",
+1
View File
@@ -61,6 +61,7 @@
"Healed {n} dust spot{}": "{n} tache{} de poussière corrigée(s)",
"Import cancelled · {} photo{} added": "Importation annulée · {} photo{} ajoutée(s)",
"Import failed: {e}": "Échec de l’importation : {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Importez des photos avec Fichier → Importer des photos… ({}) ou déposez-les ici",
"Import warnings ({n}):\n{warnings}": "Avertissements d’importation ({n}) :\n{warnings}",
"Imported {n} point curve preset{}": "{n} préréglage{} de courbe à points importé(s)",
"Imported {n} preset{}": "{n} préréglage{} importé(s)",
+1 -1
View File
@@ -42,6 +42,7 @@
"Add to Local": "Ajouter à Local",
"Add to My Photos": "Ajouter à Mes photos",
"Can't be moved here": "Impossible de les déplacer ici",
"Import photos with File → Import Photos…, or drop them here": "Importez des photos avec Fichier → Importer des photos… ou déposez-les ici",
"This row covers more than one disk: drop on a folder inside it": "Cette ligne couvre plusieurs disques : déposez-les sur un dossier qu’elle contient",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "Les photos locales ne sont pas encore dans la bibliothèque : Ajouter à Mes photos d’abord, puis déplacez-les",
"Add to Selected Photos": "Ajouter aux photos sélectionnées",
@@ -677,7 +678,6 @@
"Import as new": "Importer comme nouvelles",
"Import from Device": "Importer depuis un appareil",
"Import from Folder…": "Importer depuis un dossier…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importez des photos avec Fichier → Importer des photos… (Cmd+Maj+I) ou déposez-les ici",
"Imported": "Importées",
"Imported Photos": "Photos importées",
"Importing": "Importation en cours",
+1
View File
@@ -33,6 +33,7 @@
"Exporting {} of {total}": "Mengekspor {} dari {total}",
"Filter bar — {active} active filter{}": "Bilah filter — {active} filter aktif{:.0}",
"Healed {n} dust spot{}": "{n} bintik debu diperbaiki{:.0}",
"Import photos with File → Import Photos… ({}), or drop them here": "Impor foto melalui File → Impor foto… ({}), atau seret ke sini",
"Imported {n} point curve preset{}": "{n} preset kurva titik diimpor{:.0}",
"Imported {n} preset{}": "{n} preset{:.0} diimpor",
"Imported {n} preset{}, {f} file{} not readable": "{n} preset diimpor{0:.0}, {f} file tidak dapat dibaca{1:.0}",
+1 -1
View File
@@ -916,7 +916,7 @@
"Import from Folder…": "Impor dari folder…",
"Import new photos": "Impor foto baru",
"Import photos to get started": "Impor foto untuk memulai",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Impor foto melalui File → Impor foto… (Cmd+Shift+I), atau seret ke sini",
"Import photos with File → Import Photos…, or drop them here": "Impor foto melalui File → Impor foto…, atau seret ke sini",
"Imported": "Diimpor",
"Imported Photos": "Foto yang diimpor",
"Importing": "Mengimpor",
+1
View File
@@ -60,6 +60,7 @@
"Healed {n} dust spot{}": "Macchie di polvere corrette: {n}{:.0}",
"Import cancelled · {} photo{} added": "Importazione annullata · foto aggiunte: {}{:.0}",
"Import failed: {e}": "Importazione non riuscita: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Importa le foto con File → Importa foto… ({}), oppure trascinale qui",
"Import warnings ({n}):\n{warnings}": "Avvisi di importazione ({n}):\n{warnings}",
"XMP profile \"{profile}\" was not applied for {path}; colors may differ from Lightroom.": "Il profilo XMP \"{profile}\" non è stato applicato a {path}; i colori possono differire da Lightroom.",
"Lightroom geometry was not preserved for {path}; {mode} will be recalculated.": "La geometria di Lightroom non è stata conservata per {path}; {mode} verrà ricalcolato.",
+1 -1
View File
@@ -42,6 +42,7 @@
"Add to Local": "Aggiungi a Locale",
"Add to My Photos": "Aggiungi a Le mie foto",
"Can't be moved here": "Non si possono spostare qui",
"Import photos with File → Import Photos…, or drop them here": "Importa le foto con File → Importa foto…, oppure trascinale qui",
"This row covers more than one disk: drop on a folder inside it": "Questa riga comprende più di un disco: rilascia su una cartella al suo interno",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "Le foto locali non sono ancora nella libreria: prima Aggiungi a Le mie foto, poi spostale",
"Add to Selected Photos": "Aggiungi alle foto selezionate",
@@ -679,7 +680,6 @@
"Import as new": "Importa come nuova",
"Import from Device": "Importa da dispositivo",
"Import from Folder…": "Importa da cartella…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importa le foto con File → Importa foto… (Cmd+Maiusc+I), oppure trascinale qui",
"Imported": "Importato",
"Imported Photos": "Foto importate",
"Importing": "Importazione in corso",
+1
View File
@@ -33,6 +33,7 @@
"Exporting {} of {total}": "書き出し中:{total}枚中{}枚",
"Filter bar — {active} active filter{}": "フィルターバー:{active}件適用中{:.0}",
"Healed {n} dust spot{}": "{n}か所のほこりを修復しました{:.0}",
"Import photos with File → Import Photos… ({}), or drop them here": "「ファイル → 写真を読み込む…」({})から読み込むか、ここに写真をドロップしてください",
"Imported {n} point curve preset{}": "{n}件のポイントカーブを読み込みました{:.0}",
"Imported {n} preset{}": "{n}件のプリセットを読み込みました{:.0}",
"Imported {n} preset{}, {f} file{} not readable": "{n}件のプリセットを読み込みました{:.0}。{f}件は読み込めません{:.0}",
+1 -1
View File
@@ -43,6 +43,7 @@
"Add to Local": "ローカルに追加",
"Add to My Photos": "マイフォトに追加",
"Can't be moved here": "ここには移動できません",
"Import photos with File → Import Photos…, or drop them here": "「ファイル → 写真を読み込む…」から読み込むか、ここに写真をドロップしてください",
"This row covers more than one disk: drop on a folder inside it": "この行は複数のディスクにまたがっています。中のフォルダにドロップしてください",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "ローカルの写真はまだライブラリにありません。先に「マイフォトに追加」してから移動してください",
"Add to Selected Photos": "選択した写真に追加",
@@ -839,7 +840,6 @@
"Import Profiles & Presets…": "プロファイルとプリセットを読み込む…",
"Import from Device": "デバイスから読み込む",
"Import from Folder…": "フォルダから読み込む…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "「ファイル → 写真を読み込む…」(⌘⇧I)から読み込むか、ここに写真をドロップしてください",
"Imported Photos": "写真を読み込み",
"Importing": "読み込み中",
"Importing scans the source for photos; it doesn't add the folder to Local (use Local → Browse Folder… to work in a folder without importing).": "読み込みでは写真を検索しますが、フォルダはローカルに追加されません。読み込まずに作業する場合は「ローカル → フォルダを参照…」を使ってください",
+1
View File
@@ -76,6 +76,7 @@
"Healed {n} dust spot{}": "აღდგენილია მტვრის ლაქა: {n}{:.0}",
"Import cancelled · {} photo{} added": "იმპორტი გაუქმდა · დაემატა ფოტო: {}{:.0}",
"Import failed: {e}": "იმპორტი ვერ მოხერხდა: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "ფოტოების იმპორტისთვის გამოიყენეთ ფაილი → ფოტოების იმპორტი… ({}), ან ჩააგდეთ ისინი აქ",
"Import warnings ({n}):\n{warnings}": "იმპორტის გაფრთხილებები ({n}):\n{warnings}",
"Imported {n} point curve preset{}": "იმპორტირებულია წერტილოვანი მრუდის პრესეტი: {n}{:.0}",
"Imported {n} preset{}": "იმპორტირებულია პრესეტი: {n}{:.0}",
+1 -1
View File
@@ -974,7 +974,7 @@
"Import from Device": "იმპორტი მოწყობილობიდან",
"Import from Folder…": "იმპორტი საქაღალდიდან…",
"Import new photos": "ახალი ფოტოების იმპორტი",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "ფოტოების იმპორტისთვის გამოიყენეთ ფაილი → ფოტოების იმპორტი… (Cmd+Shift+I), ან ჩააგდეთ ისინი აქ",
"Import photos with File → Import Photos…, or drop them here": "ფოტოების იმპორტისთვის გამოიყენეთ ფაილი → ფოტოების იმპორტი…, ან ჩააგდეთ ისინი აქ",
"Import presets from other editors: XMP presets, classic `.lrtemplate` files, \"DNG presets\" from mobile apps and `.zip`": "პრესეტების იმპორტი სხვა რედაქტორებიდან: XMP პრესეტები, კლასიკური `.lrtemplate` ფაილები, მობილური აპების „DNG პრესეტები“ და `.zip`",
"Import ▸ Copy verifies every copy, like Move (issue #96): each file is written as a new file, synced to disk and": "იმპორტი → კოპირება ყოველ ასლს ამოწმებს, ისევე როგორც გადატანა (ხარვეზი #96): ყოველი ფაილი ახალ ფაილად იწერება, დისკზე სინქრონიზდება და",
"Import ▸ Move: photos go into the destination (with the same folders and renaming as Copy, e.g.": "იმპორტი → გადატანა: ფოტოები დანიშნულების ადგილას გადადის (იგივე საქაღალდეებითა და გადარქმევით, რაც კოპირებისას, მაგ.",
+1
View File
@@ -60,6 +60,7 @@
"Healed {n} dust spot{}": "Usunięte plamki kurzu: {n}{:.0}",
"Import cancelled · {} photo{} added": "Import anulowany · dodane zdjęcia: {}{:.0}",
"Import failed: {e}": "Import nieudany: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Importuj zdjęcia przez Plik → Importuj zdjęcia… ({}) lub przeciągnij je tutaj",
"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}",
+1 -1
View File
@@ -661,7 +661,7 @@
"Import as new": "Importuj jako nowe",
"Import from Device": "Importuj z urządzenia",
"Import from Folder…": "Importuj z folderu…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importuj zdjęcia przez Plik → Importuj zdjęcia… (Cmd+Shift+I) lub przeciągnij je tutaj",
"Import photos with File → Import Photos…, or drop them here": "Importuj zdjęcia przez Plik → Importuj zdjęcia… lub przeciągnij je tutaj",
"Imported": "Zaimportowane",
"Imported Photos": "Zaimportowane zdjęcia",
"Importing": "Importowanie",
@@ -43,6 +43,7 @@
"Filter bar — {active} active filter{}": "Barra de filtros — {active} filtro{0} ativo{0}",
"Healed {n} dust spot{}": "{n} mancha{0} de poeira recuperada{0}",
"Import cancelled · {} photo{} added": "Importação cancelada · {0} foto{1} adicionada{1}",
"Import photos with File → Import Photos… ({}), or drop them here": "Importe fotos com Arquivo → Importar fotos… ({}) ou solte-as aqui",
"Imported {n} point curve preset{}": "{n} predefinição(ões) de curva de pontos importada(s){:.0}",
"Imported {n} preset{}": "{n} predefinição(ões) importada(s){:.0}",
"Imported {n} preset{}, {f} file{} not readable": "{n} predefinição(ões) importada(s){:.0}, {f} arquivo(s) não legível(is){:.0}",
+1 -1
View File
@@ -44,6 +44,7 @@
"Add to Local": "Adicionar a Local",
"Add to My Photos": "Adicionar às Minhas fotos",
"Can't be moved here": "Não podem ser movidas para cá",
"Import photos with File → Import Photos…, or drop them here": "Importe fotos com Arquivo → Importar fotos… ou solte-as aqui",
"This row covers more than one disk: drop on a folder inside it": "Esta linha abrange mais de um disco: solte em uma pasta dentro dela",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "As fotos locais ainda não estão na biblioteca: primeiro Adicionar às Minhas fotos, depois mova-as",
"Add to Selected Photos": "Adicionar às fotos selecionadas",
@@ -686,7 +687,6 @@
"Import as new": "Importar como novas",
"Import from Device": "Importar de dispositivo",
"Import from Folder…": "Importar de pasta…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importe fotos com Arquivo → Importar fotos… (Cmd+Shift+I) ou solte-as aqui",
"Imported": "Importados",
"Imported Photos": "Fotos importadas",
"Importing": "Importando",
+1
View File
@@ -64,6 +64,7 @@
"Healed {n} dust spot{}": "Убрано пылинок: {n}{:.0}",
"Import cancelled · {} photo{} added": "Импорт отменён · добавлено фото: {}{:.0}",
"Import failed: {e}": "Ошибка импорта: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Импортируйте фото через Файл → Импорт фото… ({}) или перетащите их сюда",
"Import warnings ({n}):\n{warnings}": "Предупреждения импорта ({n}):\n{warnings}",
"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.",
+1 -1
View File
@@ -218,6 +218,7 @@
"The layout image can't be shown": "Не удаётся показать изображение макета",
"Their photos in the grid": "Их фото в сетке",
"This page setup is not valid": "Эти параметры страницы недопустимы",
"Import photos with File → Import Photos…, or drop them here": "Импортируйте фото через Файл → Импорт фото… или перетащите их сюда",
"This row covers more than one disk: drop on a folder inside it": "Эта строка охватывает несколько дисков: перетащите на папку внутри неё",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "Локальных фото ещё нет в библиотеке: сначала «Добавить в «Мои фото»», затем перемещайте",
"Add to Selected Photos": "Добавить к выбранным фото",
@@ -762,7 +763,6 @@
"Import Profiles & Presets…": "Импортировать профили и пресеты…",
"Import from Device": "Импорт с устройства",
"Import from Folder…": "Импорт из папки…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Импортируйте фото через Файл → Импорт фото… (Cmd+Shift+I) или перетащите их сюда",
"Imported Photos": "Импортированные фото",
"Importing": "Импорт",
"Importing Lightroom Catalog": "Импорт каталога Lightroom",
+1
View File
@@ -89,6 +89,7 @@
"Healed {n} dust spot{}": "Retuscherade {n} dammfläck{}",
"Import cancelled · {} photo{} added": "Importen avbröts · {} foto{} tillagda",
"Import failed: {e}": "Importen misslyckades: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Importera foton med Arkiv → Importera foton… ({}) eller släpp dem här",
"Import warnings ({n}):\n{warnings}": "Importvarningar ({n}):\n{warnings}",
"Imported {e} mask effect{} (Masking ▸ Effect)": "Importerade {e} maskeffekt{} (Maskering → Effekt)",
"Imported {name}": "Importerade {name}",
+1 -1
View File
@@ -25,6 +25,7 @@
"4 MiB and connections at 16.": "4 MiB och anslutningar till 16.",
"630 drivers): on Windows the window and GPU rendering use DirectX 12 only and never load the Vulkan driver unless": "630-drivrutiner): i Windows använder fönstret och GPU-renderingen endast DirectX 12 och läser aldrig in Vulkan-drivrutinen om inte",
"= exactly": "= exakt",
"Import photos with File → Import Photos…, or drop them here": "Importera foton med Arkiv → Importera foton… eller släpp dem här",
"`img_1-1.JPG`; on case-insensitive volumes the case change still goes through.": "`img_1-1.JPG`; på skiftlägesokänsliga volymer går ändringen av skiftläge ändå igenom.",
"`Photos/2026/20260114/20260114_001.jpg`) together with their XMP sidecars; each original leaves the card only after its": "`Photos/2026/20260114/20260114_001.jpg`) tillsammans med sina XMP-sidofiler; varje original lämnar kortet först efter att dess",
"A 16:9 frame with black bars above and below, the title in the corner, fades through black and a closing card.": "En 16:9-bild med svarta fält ovanför och nedanför, titeln i hörnet, toningar via svart och ett avslutande kort.",
@@ -961,7 +962,6 @@
"Import Lightroom Catalog…": "Importera Lightroom-katalog…",
"Import new photos": "Importera nya foton",
"Import Photos": "Importera foton",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Importera foton med Arkiv → Importera foton… (Cmd+Shift+I) eller släpp dem här",
"Import Photos…": "Importera foton…",
"Import Point Curve Presets": "Importera förinställningar för punktkurva",
"Import Point Curve Presets…": "Importera förinställningar för punktkurva…",
+1
View File
@@ -61,6 +61,7 @@
"Healed {n} dust spot{}": "Усунено пилових плям: {n}{:.0}",
"Import cancelled · {} photo{} added": "Імпорт скасовано · додано фото: {}{:.0}",
"Import failed: {e}": "Помилка імпорту: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Імпортуйте фото через Файл → Імпортувати фото… ({}) або перетягніть їх сюди",
"Import warnings ({n}):\n{warnings}": "Попередження імпорту ({n}):\n{warnings}",
"Imported {n} point curve preset{}": "Імпортовано наборів налаштувань точкової кривої: {n}{:.0}",
"Imported {n} preset{}": "Імпортовано наборів налаштувань: {n}{:.0}",
+1 -1
View File
@@ -111,6 +111,7 @@
"Home": "Домашня тека",
"Horizontal inset (% of short edge)": "Відступ по горизонталі (% короткого краю)",
"ISO Speed": "Чутливість ISO",
"Import photos with File → Import Photos…, or drop them here": "Імпортуйте фото через Файл → Імпортувати фото… або перетягніть їх сюди",
"Imported": "Імпортовані",
"Join the ArtCraft Discord": "Приєднатися до Discord ArtCraft",
"Join the ArtCraft Discord…": "Приєднатися до Discord ArtCraft…",
@@ -1017,7 +1018,6 @@
"Import Profiles & Presets…": "Імпортувати профілі й набори налаштувань…",
"Import from Device": "Імпортувати з пристрою",
"Import from Folder…": "Імпортувати з теки…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Імпортуйте фото через Файл → Імпортувати фото… (Cmd+Shift+I) або перетягніть їх сюди",
"Imported Photos": "Імпортовані фото",
"Importing": "Імпорт",
"Importing scans the source for photos; it doesn't add the folder to Local (use Local → Browse Folder… to work in a folder without importing).": "Імпорт сканує джерело фото; він не додає теку до локальних (використовуйте Локальні → Оглянути теку…, щоб працювати в теці без імпорту).",
+1
View File
@@ -92,6 +92,7 @@
"Healed {n} dust spot{}": "Đã xử lý {n} vết bụi{:.0}",
"Import cancelled · {} photo{} added": "Đã hủy nhập · đã thêm {} ảnh{:.0}",
"Import failed: {e}": "Nhập thất bại: {e}",
"Import photos with File → Import Photos… ({}), or drop them here": "Nhập ảnh bằng Tệp → Nhập ảnh… ({}), hoặc thả vào đây",
"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 {name}": "Imported {name}",
+1 -1
View File
@@ -835,7 +835,7 @@
"Import from Device": "Nhập từ thiết bị",
"Import from Folder…": "Nhập từ thư mục…",
"Import new photos": "Nhập ảnh mới",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "Nhập ảnh bằng Tệp → Nhập ảnh… (Cmd+Shift+I), hoặc thả vào đây",
"Import photos with File → Import Photos…, or drop them here": "Nhập ảnh bằng Tệp → Nhập ảnh…, hoặc thả vào đây",
"Import presets from other editors: XMP presets, classic `.lrtemplate` files, \"DNG presets\" from mobile apps and `.zip`": "Nhập thiết lập sẵn từ trình soạn khác: preset XMP, tệp `.lrtemplate` cổ điển, \"DNG presets\" từ app di động và `.zip`",
"Import ▸ Copy verifies every copy, like Move (issue #96): each file is written as a new file, synced to disk and": "Nhập → Sao chép xác minh mọi bản sao, như Di chuyển (issue #96): mỗi tệp ghi thành tệp mới, đồng bộ ra đĩa và",
"Import ▸ Move: photos go into the destination (with the same folders and renaming as Copy, e.g.": "Nhập → Di chuyển: ảnh vào đích (cùng thư mục và đổi tên như Sao chép, ví dụ",
@@ -33,6 +33,7 @@
"Exporting {} of {total}": "正在导出 {total} 张中的第 {0} 张",
"Filter bar — {active} active filter{}": "筛选栏 — 已启用 {active} 个筛选{0:.0}",
"Healed {n} dust spot{}": "已修复 {n} 处尘点{0:.0}",
"Import photos with File → Import Photos… ({}), or drop them here": "使用“文件 → 导入照片…”({})导入照片,或将照片拖放到此处",
"Imported {n} point curve preset{}": "已导入 {n} 个点曲线预设{0:.0}",
"Imported {n} preset{}": "已导入 {n} 个预设{0:.0}",
"Imported {n} preset{}, {f} file{} not readable": "已导入 {n} 个预设,{f} 个文件无法读取{0:.0}{1:.0}",
+1 -1
View File
@@ -44,6 +44,7 @@
"Add to Local": "添加到本地",
"Add to My Photos": "添加到我的照片",
"Can't be moved here": "无法移到这里",
"Import photos with File → Import Photos…, or drop them here": "使用“文件 → 导入照片…”导入照片,或将照片拖放到此处",
"This row covers more than one disk: drop on a folder inside it": "此行涵盖多个磁盘:请拖放到其中的文件夹",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "本地照片尚未在图库中:请先“添加到我的照片”,再移动",
"Add to Selected Photos": "添加到所选照片",
@@ -806,7 +807,6 @@
"Import Profiles & Presets…": "导入配置文件与预设…",
"Import from Device": "从设备导入",
"Import from Folder…": "从文件夹导入…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "使用“文件 → 导入照片…”(Cmd+Shift+I)导入照片,或将照片拖放到此处",
"Imported Photos": "已导入的照片",
"Importing": "正在导入",
"Importing scans the source for photos; it doesn't add the folder to Local (use Local → Browse Folder… to work in a folder without importing).": "导入会扫描源中的照片,但不会将该文件夹添加到“本地”(若想在不导入的情况下处理某个文件夹,请使用“本地 → 浏览文件夹…”)。",
@@ -40,6 +40,7 @@
"Filter bar — {active} active filter{}": "篩選列 — 已套用 {active} 個篩選條件{:.0}",
"Healed {n} dust spot{}": "已修復 {n} 個灰塵斑點{:.0}",
"Import cancelled · {} photo{} added": "已取消匯入 · 已加入 {} 張照片{:.0}",
"Import photos with File → Import Photos… ({}), or drop them here": "使用「檔案 → 匯入照片…」({}),或將照片拖放至此",
"Imported {n} point curve preset{}": "已匯入 {n} 個點曲線預設集{:.0}",
"Imported {n} preset{}": "已匯入 {n} 個預設集{:.0}",
"Imported {n} preset{}, {f} file{} not readable": "已匯入 {n} 個預設集{:.0},{f} 個檔案無法讀取{:.0}",
+1 -1
View File
@@ -44,6 +44,7 @@
"Add to Local": "加入本機",
"Add to My Photos": "加入我的照片",
"Can't be moved here": "無法移到這裡",
"Import photos with File → Import Photos…, or drop them here": "使用「檔案 → 匯入照片…」,或將照片拖放至此",
"This row covers more than one disk: drop on a folder inside it": "此列涵蓋多個磁碟:請拖放到其中的資料夾",
"Local photos aren't in the library yet: Add to My Photos first, then move them": "本機照片尚未在照片庫中:請先「加入我的照片」,再移動",
"Add to Selected Photos": "加入選取的照片",
@@ -807,7 +808,6 @@
"Import Profiles & Presets…": "匯入描述檔與預設集…",
"Import from Device": "從裝置匯入",
"Import from Folder…": "從資料夾匯入…",
"Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here": "使用「檔案 → 匯入照片…」(Cmd+Shift+I),或將照片拖放至此",
"Imported Photos": "已匯入的照片",
"Importing": "正在匯入",
"Importing scans the source for photos; it doesn't add the folder to Local (use Local → Browse Folder… to work in a folder without importing).": "匯入會掃描來源中的照片,不會將資料夾加入本機(若要直接使用資料夾中的檔案,請選擇「本機 → 瀏覽資料夾…」)。",
+1 -1
View File
@@ -77,7 +77,7 @@ pub fn body(app: &mut LightcraftApp, ui: &mut egui::Ui, t: &Tokens) {
});
}
/// `Cmd+Shift+Z` as menus show it (`⌘⇧Z` on macOS).
/// `Cmd+Shift+Z` as menus show it (`⇧⌘Z` on macOS).
fn menu_text(sc: &str, mac: bool) -> String {
crate::menubar::shortcut_text(sc, mac)
}
+8 -6
View File
@@ -992,20 +992,22 @@ pub fn run_native_command(app: &mut LightcraftApp, id: &str, params: Value) -> N
policy
}
/// Human-readable shortcut text for menus: `Cmd+Shift+Z` → `⌘⇧Z` on macOS, `Ctrl+Shift+Z` elsewhere.
/// Human-readable shortcut text for menus: `Cmd+Shift+Z` → `⇧⌘Z` on macOS, `Ctrl+Shift+Z` elsewhere.
/// On macOS the modifiers come in AppKit's and Apple's HIG order, ⌃⌥⇧⌘, however the binding spells them.
pub fn shortcut_text(sc: &str, mac: bool) -> String {
if mac {
let mut mods = String::new();
let (mut ctrl, mut alt, mut shift, mut cmd) = (false, false, false, false);
let mut key = "";
for part in sc.split('+') {
match part {
"Ctrl" => mods.push('⌃'),
"Alt" => mods.push('⌥'),
"Shift" => mods.push('⇧'),
"Cmd" => mods.push('⌘'),
"Ctrl" => ctrl = true,
"Alt" => alt = true,
"Shift" => shift = true,
"Cmd" => cmd = true,
k => key = k,
}
}
let mods: String = [(ctrl, '⌃'), (alt, '⌥'), (shift, '⇧'), (cmd, '⌘')].into_iter().filter_map(|(on, glyph)| on.then_some(glyph)).collect();
let key = match key {
"Delete" => "⌫",
"Escape" => "⎋",
+14 -2
View File
@@ -43,7 +43,7 @@ fn grid_menu_shortcut_hints_keep_native_toggle_dispatch() {
assert_eq!(label, "Photo Grid");
assert_eq!(accelerator, Some("G"));
assert!(!native_menu_delivers(accelerator.unwrap()));
for (key, text) in [("Cmd+Shift+G", "⌘⇧G"), ("Ctrl+G", "⌃G"), ("F3", "F3")] {
for (key, text) in [("Cmd+Shift+G", "⇧⌘G"), ("Ctrl+G", "⌃G"), ("F3", "F3")] {
crate::shortcuts::assign(&mut keymap, "view.gridToggle", Some(key)).unwrap();
let (label, accelerator) = native_item_presentation(&keymap, id, &Value::Null, "Photo Grid", Some(key));
assert_eq!(label, format!("Photo Grid ({text})"));
@@ -767,11 +767,23 @@ fn native_menu_commands_respect_the_blocking_window_policy() {
#[test]
fn shortcut_text_per_platform() {
assert_eq!(shortcut_text("Cmd+Shift+Z", true), "⌘⇧Z");
assert_eq!(shortcut_text("Cmd+Shift+Z", true), "⇧⌘Z");
assert_eq!(shortcut_text("Cmd+Shift+Z", false), "Ctrl+Shift+Z");
assert_eq!(shortcut_text("Delete", true), "⌫");
}
/// AppKit and Apple's Human Interface Guidelines write modifiers ⌃⌥⇧⌘ whatever order the binding
/// was spelled in, so the hint on a button matches the menu bar's own column.
#[test]
fn shortcut_text_orders_mac_modifiers_control_option_shift_command() {
assert_eq!(shortcut_text("Cmd+Alt+Shift+C", true), "⌥⇧⌘C");
assert_eq!(shortcut_text("Shift+Alt+Ctrl+Cmd+K", true), "⌃⌥⇧⌘K");
assert_eq!(shortcut_text("Cmd+Ctrl+F", true), "⌃⌘F");
assert_eq!(shortcut_text("Shift+Cmd+Up", true), "⇧⌘↑");
assert_eq!(shortcut_text("Shift+Alt+Y", true), "⌥⇧Y");
assert_eq!(shortcut_text("Cmd+Alt+Shift+C", false), "Ctrl+Alt+Shift+C", "other platforms keep the binding as written");
}
/// Every item of a menu, submenus included.
fn flat(nodes: &[MenuNode]) -> Vec<&MenuNode> {
nodes
+1 -1
View File
@@ -347,7 +347,7 @@ mod tests {
fn reset_tooltip_names_the_shortcut_of_this_platform() {
let keymap = crate::shortcuts::Keymap::new();
assert_eq!(reset_tip(&keymap, false), "Reset all edits (Ctrl+Shift+R)");
assert_eq!(reset_tip(&keymap, true), "Reset all edits (⌘⇧R)");
assert_eq!(reset_tip(&keymap, true), "Reset all edits (⇧⌘R)");
let rebound: crate::shortcuts::Keymap = [("develop.reset".to_string(), "Cmd+Alt+R".to_string())].into();
assert_eq!(reset_tip(&rebound, false), "Reset all edits (Ctrl+Alt+R)");
let unbound: crate::shortcuts::Keymap = [("develop.reset".to_string(), String::new())].into();
@@ -49,6 +49,18 @@ pub fn hint(keymap: &Keymap, mac: bool) -> String {
}
}
/// The grid's second line when a view with no photos is not the empty library (an empty album, say):
/// the way in is File → Import Photos…, with the shortcut that command is bound to now, written as
/// menus write it. With no shortcut the sentence leaves it out.
pub fn no_photos_body(keymap: &Keymap, mac: bool) -> String {
match crate::shortcuts::shortcut_of(keymap, "file.addPhotos") {
Some(sc) => {
crate::i18n::tr_format!("Import photos with File → Import Photos… ({}), or drop them here", crate::menubar::shortcut_text(sc, mac))
}
None => crate::i18n::tr("Import photos with File → Import Photos…, or drop them here").to_string(),
}
}
const IMPORT_PHOTOS: EmptyAction = EmptyAction { command: "file.addPhotos", label: "Import Photos…", widget: "button:emptyImportPhotos" };
const IMPORT_LIGHTROOM: EmptyAction =
EmptyAction { command: "file.importLightroom", label: "Import Lightroom Catalog…", widget: "button:emptyImportLightroom" };
+2 -1
View File
@@ -341,7 +341,8 @@ fn show_inner(app: &mut LightcraftApp, ui: &mut egui::Ui) {
} else if super::empty_library::shown(&app.session) {
super::empty_library::show(app, ui, ui.max_rect());
} else {
super::empty_message(ui, ui.max_rect(), "No photos", "Import photos with File → Import Photos… (Cmd+Shift+I), or drop them here");
let mac = ui.ctx().os() == egui::os::OperatingSystem::Mac;
super::empty_message(ui, ui.max_rect(), "No photos", &super::empty_library::no_photos_body(&app.ui.settings.keymap, mac));
}
return;
}
+19 -2
View File
@@ -132,16 +132,33 @@ fn the_top_bar_imports_in_every_library() {
#[test]
fn the_hint_shows_the_shortcut_as_bound() {
let mut keymap = crate::state::AppSettings::default().keymap;
assert_eq!(empty_library::hint(&keymap, true), "or drop photos and folders into this window · ⌘⇧I");
assert_eq!(empty_library::hint(&keymap, true), "or drop photos and folders into this window · ⇧⌘I");
assert_eq!(empty_library::hint(&keymap, false), "or drop photos and folders into this window · Ctrl+Shift+I");
// a remapped shortcut is the one shown
crate::shortcuts::assign(&mut keymap, "file.addPhotos", Some("Cmd+Alt+I")).unwrap();
assert_eq!(empty_library::hint(&keymap, true), "or drop photos and folders into this window · ⌘⌥I");
assert_eq!(empty_library::hint(&keymap, true), "or drop photos and folders into this window · ⌥⌘I");
// and none at all leaves the key out
crate::shortcuts::assign(&mut keymap, "file.addPhotos", None).unwrap();
assert_eq!(empty_library::hint(&keymap, true), "or drop photos and folders into this window");
}
/// The grid's line for a view with no photos that is not the empty library names the shortcut as
/// the menu bar lists it, in the platform's notation, and follows a rebinding.
#[test]
fn the_no_photos_line_lists_modifiers_in_the_menu_order() {
let mut keymap = crate::state::AppSettings::default().keymap;
let mac = empty_library::no_photos_body(&keymap, true);
assert!(mac.contains("⇧⌘I") && !mac.contains("⌘⇧"), "{mac}");
let other = empty_library::no_photos_body(&keymap, false);
assert!(other.contains("Ctrl+Shift+I") && !other.contains("Cmd"), "{other}");
crate::shortcuts::assign(&mut keymap, "file.addPhotos", Some("Cmd+Alt+Shift+I")).unwrap();
let rebound = empty_library::no_photos_body(&keymap, true);
assert!(rebound.contains("⌥⇧⌘I"), "{rebound}");
crate::shortcuts::assign(&mut keymap, "file.addPhotos", None).unwrap();
let unbound = empty_library::no_photos_body(&keymap, true);
assert!(!unbound.contains('⌘') && !unbound.contains("Cmd") && !unbound.starts_with("or "), "{unbound}");
}
#[test]
fn a_folder_browsed_under_local_is_not_the_empty_library() {
// its photos aren't in the library, but they are what is on screen: no import prompt
+2 -2
View File
@@ -19,8 +19,8 @@ Select photos in Photo Grid or Square Grid, then use:
| `\` (backslash) | Show / hide the Filter Bar |
| ⌘K / Ctrl+K | Add Keywords: show the Keywords panel with the cursor in its Add keyword box |
| ⌘L / Ctrl+L | Enable Filters: switch the filter off and on |
| ⌘⌥⇧C / Ctrl+Alt+Shift+C | Copy Metadata: copy the active photo's metadata |
| ⌘⌥⇧V / Ctrl+Alt+Shift+V | Paste Metadata: paste the copied metadata on the selected photos |
| ⌥⇧⌘C / Ctrl+Alt+Shift+C | Copy Metadata: copy the active photo's metadata |
| ⌥⇧⌘V / Ctrl+Alt+Shift+V | Paste Metadata: paste the copied metadata on the selected photos |
Enter opens the active photo without changing the selection. Text fields, dialogs and open popups keep the key; a custom Enter binding takes precedence. Enter has no additional action in Detail.
+3 -1
View File
@@ -1,6 +1,6 @@
# Lightroom parity checklist
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-27 · **Change:** minor (MENU-BAR: on macOS two menu rows that run the same command each get their own native row and label (File ▸ Export… and File ▸ Export with Preset ▸ Custom…; File ▸ New Album… and Photo ▸ Add to Album ▸ New Album…); LR-BEHAV-DIALOGS: a one-line prompt that is refused stays open and says why, and a New Folder on Disk says it was made; LR-FILT-SEARCH-META: `>=` / `<=` in fielded search tokens; MENU-FILE-CLOSE, KEY-CLOSEWINDOW: the notes say Close Window quits the app, after the same check as Quit; MENU-EDIT-SELECTNONE, MENU-EDIT-PASTESELECTED: Edit lists Select Only Active Photo after Deselect All and Paste Settings from Previous after Paste Selected Settings…; on macOS no doubled separators are left where Settings… moved to the app menu; 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 (MENU-BAR: every shortcut the app shows on macOS lists its modifiers ⌃⌥⇧⌘, as the menu bar does; MENU-BAR: on macOS two menu rows that run the same command each get their own native row and label (File ▸ Export… and File ▸ Export with Preset ▸ Custom…; File ▸ New Album… and Photo ▸ Add to Album ▸ New Album…); LR-BEHAV-DIALOGS: a one-line prompt that is refused stays open and says why, and a New Folder on Disk says it was made; LR-FILT-SEARCH-META: `>=` / `<=` in fielded search tokens; MENU-FILE-CLOSE, KEY-CLOSEWINDOW: the notes say Close Window quits the app, after the same check as Quit; MENU-EDIT-SELECTNONE, MENU-EDIT-PASTESELECTED: Edit lists Select Only Active Photo after Deselect All and Paste Settings from Previous after Paste Selected Settings…; on macOS no doubled separators are left where Settings… moved to the app menu; 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
@@ -495,6 +495,7 @@ visible menu bar yet: the menu model is only exposed through the control channel
| Id | Feature | Tier | Status | Evidence | Missing / notes |
|---|---|---|---|---|---|
| MENU-BAR | Menu bar rendering | P1 | ✅ | `crates/ui-egui/src/menus/menubar.rs`, `apps/lightcraft/src/native_menu.rs` | native macOS menu bar (muda) with live labels/enabled/checked; in-window menus on web/Windows/Linux (with one menu open, the pointer on another title switches to it, as in native menu bars); ⌫ and X stay egui-handled (contextual), so they show no key in the native menu; a scrolled menu draws no scrollbar over its rows: the ▲ / ▼ strips, the wheel and dragging scroll it (issue #691: egui's floating bar hid the shortcut text's last character; `crates/ui-egui/src/tests/menubar.rs`); on macOS every row of the model has its own native row, also when two rows run the same command with the same parameters (the second one has no key of its own) |
| MENU-BAR | Menu bar rendering | P1 | ✅ | `crates/ui-egui/src/menus/menubar.rs`, `apps/lightcraft/src/native_menu.rs` | native macOS menu bar (muda; every shortcut the app shows on macOS (menu rows, tooltips, hints, the Keyboard Shortcuts dialog) lists modifiers in the same ⌃⌥⇧⌘ order, `crates/ui-egui/src/menus/menubar.rs` `shortcut_text`) with live labels/enabled/checked; in-window menus on web/Windows/Linux (with one menu open, the pointer on another title switches to it, as in native menu bars); ⌫ and X stay egui-handled (contextual), so they show no key in the native menu; a scrolled menu draws no scrollbar over its rows: the ▲ / ▼ strips, the wheel and dragging scroll it (issue #691: egui's floating bar hid the shortcut text's last character; `crates/ui-egui/src/tests/menubar.rs`) |
| MENU-APP-ABOUT | About | P2 | ✅ | `cmd:app.about` | |
| MENU-APP-SETTINGS | Settings… | P0 | ✅ | `cmd:app.settings` | app menu on macOS, Edit menu elsewhere |
| MENU-APP-UPDATES | Check for updates | P2 | ⬜ | | |
@@ -799,6 +800,7 @@ Latin stays upright. Advanced Japanese composition remains open. Regression cove
| Date | Change | Summary |
|---|---|---|
| 2026-10-27 | patch | MENU-BAR: every shortcut the app shows (a menu row, a button's tooltip, a hint, the empty-album line, the Keyboard Shortcuts dialog) lists its modifiers on macOS in the menu bar's order, ⌃⌥⇧⌘ (`⇧⌘I`, not `⌘⇧I`); the empty-album line follows the keymap; status counts unchanged |
| 2026-10-25 | patch | LR-BEHAV-TITLEBAR: the top bar's title-bar gestures come from craft-window's `title_bar`: a double-click follows the system setting, and a press on a button, the search field or a panel floating over the bar never moves the window; status counts unchanged |
| 2026-10-24 | minor | KEYC-METADATA, LRC-LIB-KEYWORDS: ⌥0 / ⌥⇧0 (`keyword.nextSet`, `keyword.previousSet`) go to the next / previous keyword set; status counts unchanged (KEYC-METADATA stays 🟡) |
| 2026-10-24 | minor | KEYC-METADATA: ⌘K / Ctrl+K (`panel.addKeywords`, Add Keywords) shows the Keywords panel, opens Keywording and puts the cursor in the Add keyword box; status counts unchanged (KEYC-METADATA stays 🟡) |
+2 -2
View File
@@ -138,7 +138,7 @@ are the same in every version, so serve them with `Cache-Control: no-cache` (not
is saved; the stored library is left as it was.
- A panic (wasm is built with `panic = "abort"`) replaces the page with a message saying the
stored library is kept and to reload, instead of a frozen canvas.
- **Importing photos with no filesystem.** *File ▸ Import Photos…* (<kbd>⌘⇧I</kbd>) opens the
- **Importing photos with no filesystem.** *File ▸ Import Photos…* (<kbd>⇧⌘I</kbd>) opens the
browser's file picker. You can also drop files anywhere on the page. The bytes are written to
storage, then imported and decoded by the same engine code as the desktop app
(`lightcraft_engine::files::{probe_bytes, load_bytes}`): JPEG/PNG/TIFF/WebP and the supported
@@ -153,7 +153,7 @@ are the same in every version, so serve them with `Cache-Control: no-cache` (not
threads or `SharedArrayBuffer`. If no worker starts, rendering falls back to the main thread.
- **Every develop control** (sliders, curves, mixer, grading, masking, crop…) works as it does
on the desktop, since it's the same crate.
- **Export downloads the file.** *Export…* (<kbd>⌘⇧E</kbd>) runs the same `app.export` path as
- **Export downloads the file.** *Export…* (<kbd>⇧⌘E</kbd>) runs the same `app.export` path as
the desktop app (`lightcraft_engine::export`: JPEG/PNG/TIFF/WebP, sizing, naming). The host's
`write` service hands each file to the browser as a download instead of writing it to disk.
- **Automation.** `await lightcraft.command("library.info", "{}")` runs any engine or UI command
+7
View File
@@ -14,6 +14,13 @@
### The macOS menu bar shows every row
- File ▸ Export… no longer reads “Custom…”, File ▸ Export with Preset keeps its Custom… row, and Photo ▸ Add to Album keeps New Album…. When two menu rows ran the same command, the menu bar left the second one out and gave the first one its label; now each row is its own item and a click on either one runs the command. The View menu now also lists its second Layout Image row (without a key), as the in-window menu does.
### Shortcuts read the same way everywhere on macOS
- Wherever LightCraft shows a shortcut (the menu bar's labels, a button's tooltip, the empty-library hint, the
line under "No photos" in an empty album, the Keyboard Shortcuts dialog and its search) it lists the modifiers in
the order macOS menus use, Control, Option, Shift, Command: `⇧⌘I` where it used to say `⌘⇧I`. The line under
"No photos" also shows the shortcut as it is bound now, and as Ctrl+Shift+I on Windows and Linux, where it
always said Cmd+Shift+I. Windows and Linux otherwise keep the order a shortcut is written in.
## 2026-10-25
### `>=` and `<=` work in the search box