mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-27 11:37:13 -06:00
i18n(pl): finish the format messages, counts right for every number, test and notes
Follow-up to #1100, from #1623: - The 40 messages of pl-formats.json still in English are translated (mask effect presets, slideshow templates and export, Lightroom catalog import, keywording, people, panorama merge, the crash message), and two where only the arrow had been changed. - Polish has three plural forms (1 zdjęcie, 2 zdjęcia, 5 zdjęć). 25 messages put the number before a genitive plural, which reads wrong for 2–4, 22–24… ("Usuń 2 zdjęć"); they now put it after the noun ("Usuń zdjęcia (2)", "Zdjęcia: 22"), right for every number. `{n} {noun}` reads `{noun}: {n}` and its noun pairs share one form. `{} failed` names a task, not a count. - Dates read day.month.year (Niedziela, 20.09.2026; 09.2026), not "20 9 2026". - Test polish_switches_formats_dates_and_reads_every_count: menu and control channel, persistence, pl-* tags, dates and time, counts 0–111, user names kept verbatim, Polish glyphs in the UI faces. - docs/localization-pl.md (Polish notes), and the Polish row and links in localization.md, localization-parity.md and parity-checklist.md. The language buttons already wrap on main, so that part of #1623 is not needed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DukHNvUY45rjRnvtz91x33
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
7af7b31af6
commit
458012c464
@@ -5,17 +5,17 @@
|
||||
" · {failed} couldn't be rendered": " · nie udało się wyświetlić: {failed}",
|
||||
" · {skipped} skipped (file exists)": " · pominięto {skipped} (plik istnieje)",
|
||||
" · {} duplicate{} skipped": " · pominięte duplikaty: {}{:.0}",
|
||||
" · {} failed: {}": " · {} nieudanych: {}",
|
||||
" · {} moved": " · {} przeniesionych",
|
||||
" · {} failed: {}": " · nieudane ({}): {}",
|
||||
" · {} moved": " · przeniesione: {}",
|
||||
" · {} not readable": " · {} nie można odczytać",
|
||||
" · {} original{} left at the source": " · oryginały pozostawione w źródle: {}{:.0}",
|
||||
" · {} restored from Recently Deleted": " · {} przywróconych z Ostatnio usuniętych",
|
||||
" · {} restored from Recently Deleted": " · przywrócone z Ostatnio usuniętych: {}",
|
||||
" — not carried over: {}{}": " — nie przeniesiono: {}{}",
|
||||
"+{} more": "+{} więcej",
|
||||
", {failed} file{} not readable": ", nieczytelne pliki: {failed}{:.0}",
|
||||
"; {kept} already had a location": "; {kept} miało już przypisaną lokalizację",
|
||||
"; {outside} outside its time range": "; {outside} poza zakresem dat",
|
||||
"@{}: {} PRs, {} commits, +{} / −{} lines (Δ {}), +{} / −{} binary assets, {} – {}": "@{}: {} PR, {} zatwierdzeń, +{} / −{} wierszy (Δ {}), +{} / −{} zasobów binarnych, {} – {}",
|
||||
"@{}: {} PRs, {} commits, +{} / −{} lines (Δ {}), +{} / −{} binary assets, {} – {}": "@{}: PR: {}, zatwierdzenia: {}, wiersze: +{} / −{} (Δ {}), zasoby binarne: +{} / −{}, {} – {}",
|
||||
"Add {local_n} to My Photos": "Dodaj {local_n} do Moich zdjęć",
|
||||
"Add {} Photo{}": "Dodaj zdjęcia: {}{:.0}",
|
||||
"Add {} Photo{}, restore {}": "Dodaj zdjęcia: {}{:.0}, przywróć: {}",
|
||||
@@ -29,12 +29,12 @@
|
||||
"Already in the library: {} photo{} selected in All Photos": "Już w bibliotece — zaznaczone zdjęcia we Wszystkich zdjęciach: {}{:.0}",
|
||||
"Auto ({})": "Automatycznie ({})",
|
||||
"Auto Import: added {} photo{}": "Automatyczny import — dodane zdjęcia: {}{:.0}",
|
||||
"Auto Sync: edits apply to {n} photos": "Automatyczna synchronizacja: zmiany dotyczą {n} zdjęć",
|
||||
"Auto Sync: edits apply to {n} photos": "Automatyczna synchronizacja: zmiany obejmują zdjęcia ({n})",
|
||||
"Automatic ({} MB)": "Automatycznie ({} MB)",
|
||||
"Build 1:1 Previews ({scope})": "Utwórz podglądy 1:1 ({scope})",
|
||||
"Build Smart Previews ({scope})": "Utwórz podglądy inteligentne ({scope})",
|
||||
"Build Standard-Sized Previews ({scope})": "Utwórz podglądy o standardowym rozmiarze ({scope})",
|
||||
"Building previews for {} photos…": "Tworzenie podglądów dla {} zdjęć…",
|
||||
"Building previews for {} photos…": "Tworzenie podglądów (zdjęcia: {})…",
|
||||
"Click {}:1": "Kliknij {}:1",
|
||||
"Couldn't open the editor: {e}": "Nie można otworzyć edytora: {e}",
|
||||
"Create {n} Virtual Copies": "Utwórz {n} kopii wirtualnych",
|
||||
@@ -42,7 +42,7 @@
|
||||
"Decoder: {reason}": "Dekoder: {reason}",
|
||||
"Delete \"{label}\"": "Usuń „{label}”",
|
||||
"Delete \"{label}\" (and the mask)": "Usuń „{label}” (wraz z maską)",
|
||||
"Delete {n} Photos": "Usuń {n} zdjęć",
|
||||
"Delete {n} Photos": "Usuń zdjęcia ({n})",
|
||||
"Delete “{current}”": "Usuń „{current}”",
|
||||
"Discard Smart Previews ({scope})": "Odrzuć podglądy inteligentne ({scope})",
|
||||
"Done ({what}): {done} photo{plural}": "Gotowe ({what}) — zdjęcia: {done}{plural:.0}",
|
||||
@@ -69,10 +69,10 @@
|
||||
"Label Set: {name}": "Zestaw etykiet: {name}",
|
||||
"LightCraft could not open its window: {e}": "LightCraft nie mógł otworzyć okna: {e}",
|
||||
"LightCraft could not open its window: {e}\n\nThe log file has the details: {path}": "LightCraft nie mógł otworzyć okna: {e}\n\nSzczegóły znajdują się w pliku dziennika: {path}",
|
||||
"Lightroom catalog inspected: {photos} photos, {collections} collections, {missing} missing": "Sprawdzono katalog Lightroom: {photos} zdjęć, {collections} kolekcji, {missing} brakujących",
|
||||
"Lightroom import complete: {imported} photos added": "Import z Lightroom zakończony: dodano {imported} zdjęć",
|
||||
"Lightroom import complete: {imported} photos added, {failed} failed": "Import z Lightroom zakończony: dodano {imported} zdjęć, błędów: {failed}",
|
||||
"Lightroom import complete: {imported} photos added; index warning: {warning}": "Import z Lightroom zakończony: dodano {imported} zdjęć; ostrzeżenie indeksu: {warning}",
|
||||
"Lightroom catalog inspected: {photos} photos, {collections} collections, {missing} missing": "Sprawdzono katalog Lightroom — zdjęcia: {photos}, kolekcje: {collections}, brakujące: {missing}",
|
||||
"Lightroom import complete: {imported} photos added": "Import z Lightroom zakończony — dodane zdjęcia: {imported}",
|
||||
"Lightroom import complete: {imported} photos added, {failed} failed": "Import z Lightroom zakończony — dodane zdjęcia: {imported}, błędy: {failed}",
|
||||
"Lightroom import complete: {imported} photos added; index warning: {warning}": "Import z Lightroom zakończony — dodane zdjęcia: {imported}; ostrzeżenie indeksu: {warning}",
|
||||
"Lightroom import failed: {e}{warning}": "Import z Lightroom nieudany: {e}{warning}",
|
||||
"Lightroom inspection failed: {e}{warning}": "Sprawdzanie katalogu Lightroom nieudane: {e}{warning}",
|
||||
"MIT OR Apache-2.0. Fonts: {} (OFL). Icons: original.": "MIT lub Apache-2.0. Czcionki: {} (OFL). Ikony: oryginalne.",
|
||||
@@ -89,7 +89,7 @@
|
||||
"Profile: {}": "Profil: {}",
|
||||
"Proof Copy ({})": "Kopia próbna ({})",
|
||||
"Proof Preview · {}": "Podgląd próbny · {}",
|
||||
"Quick Develop · {n} photos": "Szybka obróbka · {n} zdjęć",
|
||||
"Quick Develop · {n} photos": "Szybka obróbka · zdjęcia: {n}",
|
||||
"Quick Develop: {name}": "Szybka obróbka: {name}",
|
||||
"Rated {}": "Ocena: {}",
|
||||
"Reading Lightroom catalog… {done} of {total}": "Odczytywanie katalogu Lightroom… {done} z {total}",
|
||||
@@ -100,7 +100,7 @@
|
||||
"Remove “{}” from Favorites": "Usuń „{}” z ulubionych",
|
||||
"Removed from {}": "Usunięto z {}",
|
||||
"Removed {what} from {name}": "Usunięto {what} z {name}",
|
||||
"Rename {n} Photos…": "Zmień nazwy {n} zdjęć…",
|
||||
"Rename {n} Photos…": "Zmień nazwy zdjęć ({n})…",
|
||||
"Rename “{name}”": "Zmień nazwę „{name}”",
|
||||
"Renames “{from}” on {n} photo{} (keywords below it too). Use | for levels, e.g. Travel|Italy. An existing name merges the two.": "Zmienia nazwę „{from}” na zdjęciach ({n}){:.0} (także podrzędne słowa kluczowe). Rozdzielaj poziomy znakiem |, np. Podróże|Włochy. Istniejąca nazwa spowoduje scalenie.",
|
||||
"Rendering on the CPU: {why}": "Renderowanie na procesorze: {why}",
|
||||
@@ -122,7 +122,7 @@
|
||||
"Version {} — a clean-room, pure-Rust photo library and raw developer.": "Wersja {} — niezależnie opracowana biblioteka zdjęć i wywoływarka RAW napisana wyłącznie w Rust.",
|
||||
"Version: {}": "Wersja: {}",
|
||||
"Virtual copy “{name}” of {of}": "Kopia wirtualna „{name}” zdjęcia {of}",
|
||||
"Working on {what} for {} photos…": "Przetwarzanie {what} dla {} zdjęć…",
|
||||
"Working on {what} for {} photos…": "Przetwarzanie: {what} (zdjęcia: {})…",
|
||||
"none (CPU rendering): {why}": "brak (renderowanie na CPU): {why}",
|
||||
"the {n} selected photos": "{n} zaznaczonych zdjęć",
|
||||
"the {} photos in view": "{} zdjęć w bieżącym widoku",
|
||||
@@ -132,12 +132,12 @@
|
||||
"{label} Grading": "Gradacja: {label}",
|
||||
"{label} {d:+} on every selected photo": "{label}: {d:+} na każdym zaznaczonym zdjęciu",
|
||||
"{label} {index} of {n}": "{label} {index} z {n}",
|
||||
"{label}, {n} photos": "{label}, {n} zdjęć",
|
||||
"{label}, {n} photos": "{label}, zdjęcia: {n}",
|
||||
"{matching} of {t} photos": "{matching} z {t} zdjęć",
|
||||
"{matching} photos": "{matching} pasujących zdjęć",
|
||||
"{matching} photos": "Pasujące zdjęcia: {matching}",
|
||||
"{mode} spot {} of {}": "{mode}: plamka {} z {}",
|
||||
"{month}": "{month}",
|
||||
"{month} {year}": "{month} {year}",
|
||||
"{month}": "{month:02}",
|
||||
"{month} {year}": "{month:02}.{year}",
|
||||
"{msg} ({failed} failed)": "{msg} (nieudanych: {failed})",
|
||||
"{name} Label": "Etykieta {name}",
|
||||
"{name} Off": "{name}: wyłączone",
|
||||
@@ -148,8 +148,8 @@
|
||||
"{n} change{} saved in memory but not written to disk: {e}\nLightCraft retries automatically; quitting now would lose {}.": "Zmiany zapisane w pamięci, ale nie na dysku ({n}){0:.0}: {e}\nLightCraft ponawia zapis automatycznie; zamknięcie programu teraz oznacza ich utratę.{1:.0}",
|
||||
"{n} change{} saved in memory but not written to disk: {e} — LightCraft will retry": "Zmiany zapisane w pamięci, ale nie na dysku ({n}){:.0}: {e} — LightCraft ponowi próbę",
|
||||
"{n} found · {sel} selected": "Znaleziono {n} · zaznaczono {sel}",
|
||||
"{n} photos": "{n} zdjęć",
|
||||
"{n} photos in {} are hidden by the filters above": "{n} zdjęć w {} jest ukrytych przez powyższe filtry",
|
||||
"{n} photos": "zdjęcia ({n})",
|
||||
"{n} photos in {} are hidden by the filters above": "Zdjęcia w {} ukryte przez powyższe filtry: {n}",
|
||||
"{n} photo{}": "Zdjęcia: {n}{:.0}",
|
||||
"{n} photo{} match · updates automatically as photos change": "Pasujące zdjęcia: {n}{:.0} · aktualizacja automatyczna po zmianach zdjęć",
|
||||
"{n} photo{} now · updates automatically as photos change": "Zdjęcia teraz: {n}{:.0} · aktualizacja automatyczna po zmianach zdjęć",
|
||||
@@ -158,25 +158,25 @@
|
||||
"{stage}… {:.0}%": "{stage}… {:.0}%",
|
||||
"{verb} {n} Photo{}": "{verb} (zdjęcia: {n}){:.0}",
|
||||
"{weekday}, {day}": "{weekday}, {day}",
|
||||
"{weekday}, {day} {month} {year}": "{weekday}, {day} {month} {year}",
|
||||
"{weekday}, {day} {month} {year}": "{weekday}, {day}.{month:02}.{year}",
|
||||
"{what} merge added": "Dodano po scaleniu: {what}",
|
||||
"{what} merge failed: {e}": "Scalanie nieudane: {what}: {e}",
|
||||
"{year}": "{year}",
|
||||
"{{date:…}} directives: {}": "Dyrektywy {{date:…}}: {}",
|
||||
"{} and higher": "{} i nowsze",
|
||||
"{} contributors · {} commits": "{} współtwórców · {} zatwierdzeń",
|
||||
"{} failed": "{} nieudanych",
|
||||
"{} files": "{} plików",
|
||||
"{} contributors · {} commits": "Współtwórcy: {} · zatwierdzenia: {}",
|
||||
"{} failed": "{}: niepowodzenie",
|
||||
"{} files": "Pliki: {}",
|
||||
"{} files and {f} folder{}": "Pliki: {}, foldery: {f}{:.0}",
|
||||
"{} item{}": "Elementy: {}{:.0}",
|
||||
"{} of 4 guides — drag along lines that should be vertical or horizontal.": "{} z 4 prowadnic — przeciągnij wzdłuż linii, które powinny być pionowe lub poziome.",
|
||||
"{} photos": "{} zdjęć",
|
||||
"{} photos · exposures {} EV": "{} zdjęć · ekspozycje {} EV",
|
||||
"{} photos · {} · {:.0}° × {:.0}°": "{} zdjęć · {} · {:.0}° × {:.0}°",
|
||||
"{} photos": "Zdjęcia: {}",
|
||||
"{} photos · exposures {} EV": "Zdjęcia: {} · ekspozycje {} EV",
|
||||
"{} photos · {} · {:.0}° × {:.0}°": "Zdjęcia: {} · {} · {:.0}° × {:.0}°",
|
||||
"{} photo{} not readable": "Nieczytelne zdjęcia: {}{:.0}",
|
||||
"{} sample{}": "Próbki: {}{:.0}",
|
||||
"{} sec": "{} s",
|
||||
"{} spot(s) on this photo": "{} plamek na tym zdjęciu",
|
||||
"{} spot(s) on this photo": "Plamki na tym zdjęciu: {}",
|
||||
"{} — show their photos": "{} — pokaż ich zdjęcia",
|
||||
"· {dups} already in the library": "· {dups} już w bibliotece",
|
||||
"· {n} photo{}": "· zdjęcia: {n}{:.0}",
|
||||
@@ -184,7 +184,7 @@
|
||||
"LightCraft can't decode this raw variant yet ({}). You're editing the camera's embedded JPEG preview, which already includes the camera's picture style (e.g. Monochrome) and white balance.": "LightCraft nie obsługuje jeszcze tego wariantu RAW ({}). Edytujesz podgląd JPEG osadzony przez aparat, zawierający już styl obrazu aparatu (np. monochromatyczny) i balans bieli.",
|
||||
"Filtered: {label}": "Filtrowanie: {label}",
|
||||
"{n} similar photo{} · View ▸ Clear Filters to see all": "Podobne zdjęcia: {n}{:.0} · Widok → Wyczyść filtry, aby zobaczyć wszystkie",
|
||||
"Moved; {} photo(s) relinked": "Przeniesiono; ponownie powiązano {} zdjęć",
|
||||
"Moved; {} photo(s) relinked": "Przeniesiono; ponownie powiązane zdjęcia: {}",
|
||||
"{} label (click more labels to show any of them)": "{} etykieta (kliknij kolejne etykiety, aby wyświetlić dowolną z nich)",
|
||||
", {} star{}": ", gwiazdki: {}{:.0}",
|
||||
", {} label": ", {} etykieta",
|
||||
@@ -199,7 +199,7 @@
|
||||
"{} MB": "{} MB",
|
||||
"Making the denoised picture… {}%": "Tworzenie odszumionego obrazu… {}%",
|
||||
"{name} · {terms}": "{name} · {terms}",
|
||||
"{n} {noun}": "{n} {noun}",
|
||||
"{n} {noun}": "{noun}: {n}",
|
||||
"Trained on: {provenance}": "Wytrenowano na: {provenance}",
|
||||
" · {queued} waiting": " · {queued} oczekuje",
|
||||
"Shows the model's terms, then downloads {} from {host}, installs it and starts using it. Nothing else is sent.": "Wyświetla warunki modelu, następnie pobiera {} z {host}, instaluje go i zaczyna używać. Żadne inne dane nie są wysyłane.",
|
||||
@@ -248,46 +248,46 @@
|
||||
"{n} photos opened for editing; each is stacked with its original": "Zdjęcia otwarte do edycji: {n}; każde połączono w stos z oryginałem",
|
||||
"· {in_source} identical copies": "· identyczne kopie: {in_source}",
|
||||
"· {trashed} in Recently Deleted": "· w Ostatnio usuniętych: {trashed}",
|
||||
" in {g} group{}": " in {g} group{}",
|
||||
" · kept, not applied: {}": " · kept, not applied: {}",
|
||||
" — kept but not applied: {}": " — kept but not applied: {}",
|
||||
"Apply to “{mask}” on Selected Photos": "Apply to “{mask}” on Selected Photos",
|
||||
"Delete the effect preset “{name}”?": "Delete the effect preset “{name}”?",
|
||||
"Delete these {n} effect presets?": "Delete these {n} effect presets?",
|
||||
"Delete {n} effect preset{}? This can't be undone.": "Delete {n} effect preset{}? This can't be undone.",
|
||||
"Effect: {name}": "Effect: {name}",
|
||||
"Exported {} effect preset{}": "Exported {} effect preset{}",
|
||||
"Imported {e} mask effect{} (Masking ▸ Effect)": "Imported {e} mask effect{} (Masking → Effect)",
|
||||
"Update “{name}” with Current Settings": "Update “{name}” with Current Settings",
|
||||
"{n} preset{}": "{n} preset{}",
|
||||
"{count} more warnings.": "{count} more warnings.",
|
||||
"{photos} catalog records processed; {collections} collections.": "{photos} catalog records processed; {collections} collections.",
|
||||
"{missing} originals are missing. Their catalog records are available; use Find Missing Photos to relink them.": "{missing} originals are missing. Their catalog records are available; use Find Missing Photos to relink them.",
|
||||
"Applied {name}": "Applied {name}",
|
||||
"Delete “{name}”?": "Delete “{name}”?",
|
||||
"Updated {name}": "Updated {name}",
|
||||
"Exported to {path}": "Exported to {path}",
|
||||
"Saved template {name}": "Saved template {name}",
|
||||
"Imported {name}": "Imported {name}",
|
||||
"Skipped {problem}": "Skipped {problem}",
|
||||
"…and {more} more": "…and {more} more",
|
||||
"Template preview: {name}": "Template preview: {name}",
|
||||
"{n} photos in view · {slides} slides · {time}": "{n} photos in view · {slides} slides · {time}",
|
||||
"{n} pages": "{n} pages",
|
||||
"{n} JPEG files": "{n} JPEG files",
|
||||
"{s} s of AV1 video": "{s} s of AV1 video",
|
||||
"Slideshow exported: {what}": "Slideshow exported: {what}",
|
||||
" · {n} skipped (could not be rendered)": " · {n} skipped (could not be rendered)",
|
||||
"{n} raws can now be developed from their raw data": "{n} raws can now be developed from their raw data",
|
||||
"The XMP sidecars of {n} photos couldn't be written (is their folder offline?). LightCraft keeps trying.": "The XMP sidecars of {n} photos couldn't be written (is their folder offline?). LightCraft keeps trying.",
|
||||
"Create the keyword “{name}”": "Create the keyword “{name}”",
|
||||
"new, inside {parent}": "new, inside {parent}",
|
||||
"Keywords of {n} selected photos": "Keywords of {n} selected photos",
|
||||
"Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "Removed “{name}” from {n} photos. Edit → Undo puts it back.",
|
||||
"LightCraft stopped unexpectedly: {e}\n\nThe log file has the details: {path}": "LightCraft stopped unexpectedly: {e}\n\nThe log file has the details: {path}",
|
||||
"LightCraft stopped unexpectedly: {e}": "LightCraft stopped unexpectedly: {e}",
|
||||
"Renames {n} face{} across the library. The files are not changed.": "Renames {n} face{} across the library. The files are not changed.",
|
||||
"“{to}” is already a person. Combining them makes one person; Undo separates them again.": "“{to}” is already a person. Combining them makes one person; Undo separates them again.",
|
||||
"{what} merge added at {mp}: its full size, {full}, needs more memory than this computer has": "{what} merge added at {mp}: its full size, {full}, needs more memory than this computer has",
|
||||
"{what} merge added at {mp}, the largest a panorama can be (its full size is {full})": "{what} merge added at {mp}, the largest a panorama can be (its full size is {full})"
|
||||
" in {g} group{}": " w grupach: {g}{:.0}",
|
||||
" · kept, not applied: {}": " · zachowane, niezastosowane: {}",
|
||||
" — kept but not applied: {}": " — zachowane, ale niezastosowane: {}",
|
||||
"Apply to “{mask}” on Selected Photos": "Zastosuj do „{mask}” na zaznaczonych zdjęciach",
|
||||
"Delete the effect preset “{name}”?": "Usunąć ustawienie efektu „{name}”?",
|
||||
"Delete these {n} effect presets?": "Usunąć zaznaczone ustawienia efektów ({n})?",
|
||||
"Delete {n} effect preset{}? This can't be undone.": "Usunąć ustawienia efektów ({n})?{:.0} Tej operacji nie można cofnąć.",
|
||||
"Effect: {name}": "Efekt: {name}",
|
||||
"Exported {} effect preset{}": "Wyeksportowane ustawienia efektów: {}{:.0}",
|
||||
"Imported {e} mask effect{} (Masking ▸ Effect)": "Zaimportowane efekty masek: {e}{:.0} (Maskowanie → Efekt)",
|
||||
"Update “{name}” with Current Settings": "Zaktualizuj „{name}” bieżącymi ustawieniami",
|
||||
"{n} preset{}": "Ustawienia: {n}{:.0}",
|
||||
"{count} more warnings.": "Pozostałe ostrzeżenia: {count}.",
|
||||
"{photos} catalog records processed; {collections} collections.": "Przetworzone rekordy katalogu: {photos}; kolekcje: {collections}.",
|
||||
"{missing} originals are missing. Their catalog records are available; use Find Missing Photos to relink them.": "Brakujące oryginały: {missing}. Ich rekordy w katalogu są dostępne; użyj polecenia Znajdź brakujące zdjęcia, aby je ponownie powiązać.",
|
||||
"Applied {name}": "Zastosowano {name}",
|
||||
"Delete “{name}”?": "Usunąć „{name}”?",
|
||||
"Updated {name}": "Zaktualizowano {name}",
|
||||
"Exported to {path}": "Wyeksportowano do {path}",
|
||||
"Saved template {name}": "Zapisano szablon {name}",
|
||||
"Imported {name}": "Zaimportowano {name}",
|
||||
"Skipped {problem}": "Pominięto: {problem}",
|
||||
"…and {more} more": "…i jeszcze {more}",
|
||||
"Template preview: {name}": "Podgląd szablonu: {name}",
|
||||
"{n} photos in view · {slides} slides · {time}": "Zdjęcia w widoku: {n} · slajdy: {slides} · {time}",
|
||||
"{n} pages": "Strony: {n}",
|
||||
"{n} JPEG files": "Pliki JPEG: {n}",
|
||||
"{s} s of AV1 video": "Wideo AV1: {s} s",
|
||||
"Slideshow exported: {what}": "Wyeksportowano pokaz slajdów: {what}",
|
||||
" · {n} skipped (could not be rendered)": " · pominięte (nie udało się wyrenderować): {n}",
|
||||
"{n} raws can now be developed from their raw data": "Pliki RAW, które można już wywołać z danych surowych: {n}",
|
||||
"The XMP sidecars of {n} photos couldn't be written (is their folder offline?). LightCraft keeps trying.": "Nie udało się zapisać plików XMP dla zdjęć ({n}) — czy ich folder jest niedostępny? LightCraft ponawia próby.",
|
||||
"Create the keyword “{name}”": "Utwórz słowo kluczowe „{name}”",
|
||||
"new, inside {parent}": "nowe, w {parent}",
|
||||
"Keywords of {n} selected photos": "Słowa kluczowe zaznaczonych zdjęć ({n})",
|
||||
"Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.": "Usunięto „{name}” ze zdjęć ({n}). Edytuj → Cofnij przywraca.",
|
||||
"LightCraft stopped unexpectedly: {e}\n\nThe log file has the details: {path}": "LightCraft nieoczekiwanie zakończył działanie: {e}\n\nSzczegóły są w pliku dziennika: {path}",
|
||||
"LightCraft stopped unexpectedly: {e}": "LightCraft nieoczekiwanie zakończył działanie: {e}",
|
||||
"Renames {n} face{} across the library. The files are not changed.": "Zmienia nazwę twarzy w całej bibliotece (twarze: {n}).{:.0} Pliki nie są zmieniane.",
|
||||
"“{to}” is already a person. Combining them makes one person; Undo separates them again.": "„{to}” to już istniejąca osoba. Połączenie utworzy jedną osobę; Cofnij rozdzieli je z powrotem.",
|
||||
"{what} merge added at {mp}: its full size, {full}, needs more memory than this computer has": "Dodano scalenie {what} w rozdzielczości {mp}: pełny rozmiar, {full}, wymaga więcej pamięci, niż ma ten komputer",
|
||||
"{what} merge added at {mp}, the largest a panorama can be (its full size is {full})": "Dodano scalenie {what} w rozdzielczości {mp}, największej możliwej dla panoramy (pełny rozmiar: {full})"
|
||||
}
|
||||
|
||||
@@ -1709,17 +1709,17 @@
|
||||
"Use": "Użyj",
|
||||
"Waiting to start…": "Oczekiwanie na uruchomienie…",
|
||||
"Works on raw files from cameras with a standard (Bayer) sensor. Other files keep their normal noise reduction.": "Działa na plikach RAW z aparatów z typową matrycą Bayera. Pozostałe pliki zachowują zwykłe odszumianie.",
|
||||
"cached picture": "obraz w pamięci podręcznej",
|
||||
"cached pictures": "obrazy w pamięci podręcznej",
|
||||
"cached picture": "Obrazy w pamięci podręcznej",
|
||||
"cached pictures": "Obrazy w pamięci podręcznej",
|
||||
"commercial use allowed": "dozwolony użytek komercyjny",
|
||||
"in use": "w użyciu",
|
||||
"installed": "zainstalowano",
|
||||
"makes AI Denoise available": "włącza odszumianie AI",
|
||||
"non-commercial use only": "wyłącznie do użytku niekomercyjnego",
|
||||
"photo has its denoised picture.": "zdjęcie ma już odszumioną wersję.",
|
||||
"photo waiting": "zdjęcie oczekuje",
|
||||
"photos have their denoised picture.": "zdjęcia mają już odszumione wersje.",
|
||||
"photos waiting": "zdjęć oczekuje",
|
||||
"photo has its denoised picture.": "Zdjęcia z odszumioną wersją",
|
||||
"photo waiting": "Oczekujące zdjęcia",
|
||||
"photos have their denoised picture.": "Zdjęcia z odszumioną wersją",
|
||||
"photos waiting": "Oczekujące zdjęcia",
|
||||
"starts using it for AI Denoise": "rozpoczyna używanie modelu do odszumiania AI",
|
||||
"terms unclear": "niejasne warunki",
|
||||
"the graphics card": "karta graficzna",
|
||||
|
||||
@@ -516,6 +516,62 @@ mod tests {
|
||||
set_language(Locale::En);
|
||||
}
|
||||
|
||||
/// Polish: the menu and control channel select it, dates read day.month.year, and every count
|
||||
/// reads right for any number. Polish has three plural forms (1 zdjęcie, 2 zdjęcia, 5 zdjęć), so
|
||||
/// counts follow their noun ("Zaimportowane zdjęcia: 22") instead of a form that fits only some.
|
||||
#[test]
|
||||
fn polish_switches_formats_dates_and_reads_every_count() {
|
||||
use crate::control::{ControlRequest, Outcome};
|
||||
let mut app = crate::LightcraftApp::new(lightcraft_engine::Session::with_demo(), Default::default());
|
||||
app.run("app.language.polish", serde_json::json!({})).unwrap();
|
||||
assert_eq!(app.ui.language, Locale::Pl);
|
||||
assert_eq!(Locale::Pl.name(), "Polski");
|
||||
assert_eq!(crate::menubar::checked(&app, "app.language.polish"), Some(true));
|
||||
assert_eq!(tr("File"), "Plik");
|
||||
assert_eq!(tr("Exposure"), "Ekspozycja");
|
||||
assert_eq!(date_group_label("2026-09-20", false), "Niedziela, 20.09.2026");
|
||||
assert_eq!(date_group_label("2026-09-20", true), "Niedziela, 20");
|
||||
assert_eq!(date_group_label("2026-09", false), "09.2026");
|
||||
assert_eq!(date_group_label("2026", false), "2026");
|
||||
assert_eq!(display_time("2026-09-20T16:04:05"), "Niedziela, 20.09.2026 16:04:05");
|
||||
for n in [0, 1, 2, 3, 4, 5, 12, 21, 22, 25, 111] {
|
||||
let s = if n == 1 { "" } else { "s" };
|
||||
assert_eq!(tr_format!("Imported {} photo{}", n, s), format!("Zaimportowane zdjęcia: {n}"));
|
||||
for (one, many, noun) in [
|
||||
("photo waiting", "photos waiting", "Oczekujące zdjęcia"),
|
||||
("cached picture", "cached pictures", "Obrazy w pamięci podręcznej"),
|
||||
("photo has its denoised picture.", "photos have their denoised picture.", "Zdjęcia z odszumioną wersją"),
|
||||
] {
|
||||
assert_eq!(tr_format!("{n} {noun}", n = n, noun = tr(if n == 1 { one } else { many })), format!("{noun}: {n}"));
|
||||
}
|
||||
assert_eq!(tr_format!("Delete {n} Photos", n = n), format!("Usuń zdjęcia ({n})"));
|
||||
assert_eq!(tr_format!("{n} preset{}", s, n = n), format!("Ustawienia: {n}"));
|
||||
}
|
||||
let name = String::from("Color 1234.56 {title} 日本語");
|
||||
assert_eq!(tr_format!("Added {n} photo{} to “{}”", "s", name, n = 22), format!("Dodano do „{name}”: 22"));
|
||||
let saved = serde_json::to_string(&app.ui).unwrap();
|
||||
assert_eq!(serde_json::from_str::<crate::state::UiState>(&saved).unwrap().language, Locale::Pl);
|
||||
let ctx = egui::Context::default();
|
||||
for tag in ["pl", "pl-PL", "pl_PL.UTF-8", "PL-pl"] {
|
||||
assert_eq!(Locale::parse_tag(tag), Some(Locale::Pl), "{tag}");
|
||||
let (request, _) = ControlRequest::new("ui.set", serde_json::json!({"language": tag}));
|
||||
let Outcome::Done(reply) = crate::control::handle(&mut app, &ctx, &request) else { panic!("expected reply") };
|
||||
assert_eq!(reply["ok"], true);
|
||||
assert_eq!(language(), Locale::Pl);
|
||||
}
|
||||
let text = painted_text(&ctx, &mut app, Locale::Pl);
|
||||
assert!(text.contains("Plik") && text.contains("Ekspozycja"), "{text}");
|
||||
ctx.fonts_mut(|fonts| {
|
||||
for family in [egui::FontFamily::Proportional, egui::FontFamily::Name(crate::theme::FONT_SEMIBOLD.into())] {
|
||||
let font = egui::FontId::new(13.0, family);
|
||||
for ch in "ąćęłńóśźżĄĆĘŁŃÓŚŹŻ„”".chars() {
|
||||
assert!(fonts.has_glyph(&font, ch), "missing Polish glyph {ch}");
|
||||
}
|
||||
}
|
||||
});
|
||||
set_language(Locale::En);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn every_language_has_a_catalog_covering_the_source() {
|
||||
assert!(crate::i18n::Locale::En.catalog().is_empty(), "the source language needs no catalog");
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Localization parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-12 · **Change:** minor (de, es, fr, ja, uk catalogs filled; re-measured) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-15 · **Change:** minor (Polish row: format messages finished, counts fixed) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6
|
||||
|
||||
How far each interface language is from `full`. How to add or maintain a language is in
|
||||
[localization.md](localization.md); per-language notes are in `localization-<code>.md`
|
||||
([zh-hans](localization-zh-hans.md), [zh-hant](localization-zh-hant.md), [ja](localization-ja.md),
|
||||
[pt-br](localization-pt-br.md), [es](localization-es.md), [de](localization-de.md),
|
||||
[ru](localization-ru.md)).
|
||||
[ru](localization-ru.md), [pl](localization-pl.md)).
|
||||
|
||||
## The target
|
||||
|
||||
@@ -58,15 +58,16 @@ that is promising but is not recorded as review, so the column says `no (communi
|
||||
| 11 | Korean | `ko` | 0 (0%) | none | **no Korean (Hangul) face**: needs a non-Adobe OFL face in craft-fonts (Noto CJK is allowed only for Chinese) | no | none | 14–22 h |
|
||||
| 12 | Vietnamese | `vi` | 0 (0%) | none | Latin with stacked diacritics (Inter covers it; check combining marks) | no | none (target: not shipped) | 10–16 h |
|
||||
|
||||
## Other languages LightCraft ships (3)
|
||||
## Other languages LightCraft ships (4)
|
||||
|
||||
| Language | Code | UI strings translated | Script | Native review | Status | To `full` |
|
||||
|---|---|---:|---|---|---|---:|
|
||||
| Traditional Chinese (Taiwan) | `zh-hant` | 1,993 / 2,304 (87%) | Hant; uses the Simplified Chinese face until craft-fonts has a TC face | no (community edits) | partial | 8–14 h (incl. the font) |
|
||||
| Russian | `ru` | 1,704 / 2,304 (74%) | Cyrillic (Inter) | no (community edits) | partial | 8–12 h |
|
||||
| Ukrainian | `uk` | 2,383 / 2,398 (99%; 2026-10-12) | Cyrillic (Inter) | no (community edits) | partial (lower-layer errors English) | 2–4 h |
|
||||
| Polish | `pl` | 2,159 messages + 291 formats; every format message translated (2026-10-15) | Latin (Inter) | no (AI-drafted; follow-up by a native speaker) | partial (lower-layer errors English) | 2–4 h (full native review) |
|
||||
|
||||
Target languages LightCraft lacks: Italian, Korean, Dutch, Polish, Swedish, Norwegian Bokmål, Thai
|
||||
Target languages LightCraft lacks: Italian, Korean, Dutch, Swedish, Norwegian Bokmål, Thai
|
||||
(Thai needs shaping and line breaking without spaces). Each Latin-script one is ~10–16 h; Thai
|
||||
~20–35 h on top of the shaping work.
|
||||
|
||||
@@ -91,6 +92,7 @@ Target languages LightCraft lacks: Italian, Korean, Dutch, Polish, Swedish, Norw
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-15 | minor | Polish row added: the format messages still in English translated, counts made right for every number, dates day.month.year ([localization-pl.md](localization-pl.md)) |
|
||||
| 2026-10-11 | minor | Shared work: the interface decides on error kinds, not English error text (#1046) |
|
||||
| 2026-10-10 | major | Created: per-language counts measured from the catalogs, the twelve key languages, script support, estimates |
|
||||
| 2026-10-12 | minor | de, es, fr, ja and uk catalogs filled to every message another catalog knows (agent translations, native review welcome); those rows re-measured against the current 2,398 messages. Other rows keep their 2026-10-10 counts (open PRs for pt-BR, ru, zh) |
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# Polski
|
||||
|
||||
Język polski (`pl`, English name **Polish**, nazwa natywna **Polski**) włącza się przez **Edytuj → Język →
|
||||
Polski** albo **Ustawienia → Ogólne → Język**. Zmiana działa od razu i jest zapamiętywana przy kolejnym
|
||||
uruchomieniu. Polecenie to `app.language.polish`; kanał sterowania przyjmuje `ui.set {"language":"pl"}`
|
||||
oraz znaczniki `pl-PL` i `pl_PL.UTF-8`. Bez okna można ustawić `LIGHTCRAFT_LANGUAGE=pl`.
|
||||
|
||||
Katalogi `crates/ui-egui/locales/pl.json` i `pl-formats.json` dodał #1100 (tłumaczenie przygotowane
|
||||
z pomocą AI). Uzupełnienie opisane niżej również przygotowano z pomocą AI; przygotował je rodzimy
|
||||
użytkownik języka polskiego (@lewandowskit). Profesjonalny tłumacz nie robił jeszcze korekty.
|
||||
|
||||
## Konwencje
|
||||
|
||||
- Menu: Plik, Edytuj, Widok, Zdjęcie, Okno, Pomoc.
|
||||
- Library = Biblioteka, Develop = Wywoływanie, Preset = Ustawienie wstępne, Stack = Stos,
|
||||
Masking = Maskowanie, Virtual Copy = Kopia wirtualna, Filmstrip = Pasek zdjęć.
|
||||
- Clarity = Przejrzystość, Dehaze = Usuń zamglenie, Vibrance = Dynamika, Saturation = Nasycenie.
|
||||
- Highlights = Światła, Shadows = Cienie, Whites = Biele, Blacks = Czernie.
|
||||
- Cudzysłowy polskie: „…”. Ścieżki menu w tekstach: `Edytuj → Cofnij`.
|
||||
- Data ma postać `20.09.2026` (dzień.miesiąc.rok), nagłówek dnia `Niedziela, 20.09.2026`,
|
||||
miesiąca `09.2026`; czas 24-godzinny (`16:04:05`).
|
||||
- **Liczby i rzeczowniki.** Polski ma trzy formy liczby mnogiej (1 zdjęcie, 2 zdjęcia, 5 zdjęć),
|
||||
a mechanizm katalogów rozróżnia tylko „jeden” i „wiele”. Dlatego liczba stoi po rzeczowniku:
|
||||
„Zaimportowane zdjęcia: 22”, „Usuń zdjęcia (3)”, „Oczekujące zdjęcia: 2”. Taka forma jest
|
||||
poprawna dla każdej liczby. Angielska końcówka liczby mnogiej jest pochłaniana przez `{:.0}`
|
||||
(jak w [localization.md](localization.md)). Po przyimku z dopełniaczem („z 10 zdjęć”, „dla 3
|
||||
zaznaczonych zdjęć”) liczba może stać przed rzeczownikiem, bo forma jest wtedy zawsze ta sama.
|
||||
- Komunikaty `{n} {noun}` (np. w panelu Odszumianie AI) mają postać `{noun}: {n}`, a obie formy
|
||||
rzeczownika (`photo waiting` / `photos waiting`) tłumaczą się tak samo.
|
||||
- Font Inter dołączony do aplikacji zawiera wszystkie polskie litery i cudzysłowy; inny font
|
||||
nie jest potrzebny.
|
||||
|
||||
## Uzupełnienie (2026-10-15)
|
||||
|
||||
- Przetłumaczono 40 komunikatów `pl-formats.json`, które były jeszcze po angielsku (ustawienia
|
||||
efektów masek, szablony pokazu slajdów, import katalogu Lightroom, słowa kluczowe, osoby,
|
||||
scalanie panoram, komunikat o nieoczekiwanym zakończeniu programu) i 2, w których zmieniono
|
||||
tylko strzałkę.
|
||||
- Poprawiono 25 komunikatów, w których liczba stała przed rzeczownikiem w dopełniaczu i dla
|
||||
2–4, 22–24… dawała błędną formę („Usuń 2 zdjęć”), oraz `{} failed`, gdzie `{}` jest nazwą
|
||||
zadania, a nie liczbą.
|
||||
- Daty: `{month} {year}` i `{weekday}, {day} {month} {year}` mają postać dzień.miesiąc.rok
|
||||
zamiast „20 9 2026”.
|
||||
|
||||
Katalog ma 2 159 zwykłych komunikatów i 291 szablonów formatów. Komunikaty, których nie ma w
|
||||
katalogu, oraz techniczne błędy niższych warstw wyświetlają się po angielsku.
|
||||
|
||||
## Weryfikacja
|
||||
|
||||
Test `i18n::tests::polish_switches_formats_dates_and_reads_every_count` sprawdza przełączanie
|
||||
z menu i kanału sterowania, zapamiętanie języka, znaczniki `pl-*`, daty, czas, liczby 0–111
|
||||
(w tym 2–4 i 22–25) w liczonych komunikatach, nazwy użytkownika pozostawione bez zmian oraz
|
||||
polskie znaki w fontach interfejsu. Zgodność placeholderów sprawdza
|
||||
`catalogs_agree_on_placeholders_and_report_gaps`.
|
||||
|
||||
Postęp dodawania języków opisuje [localization.md](localization.md).
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
The interface ships in the language it is written in (English) plus every language in the table in
|
||||
`crates/ui-egui/src/i18n.rs`. Today that is English, Simplified Chinese (`zh-hans`), Traditional
|
||||
Chinese (`zh-hant`, Taiwan), Japanese (`ja`), Brazilian Portuguese (`pt-br`), Spanish (`es`), German (`de`), Russian (`ru`), French (`fr`), Ukrainian (`uk`) and Czech (`cs`). This file is the reference for **adding or maintaining a language**; the per-language notes
|
||||
Chinese (`zh-hant`, Taiwan), Japanese (`ja`), Brazilian Portuguese (`pt-br`), Spanish (`es`), German (`de`), Russian (`ru`), French (`fr`), Ukrainian (`uk`), Czech (`cs`) and Polish (`pl`). This file is the reference for **adding or maintaining a language**; the per-language notes
|
||||
are in [`localization-zh-hans.md`](localization-zh-hans.md), [`localization-zh-hant.md`](localization-zh-hant.md),
|
||||
[`localization-ja.md`](localization-ja.md), [`localization-pt-br.md`](localization-pt-br.md), [`localization-es.md`](localization-es.md),
|
||||
[`localization-de.md`](localization-de.md), [`localization-ru.md`](localization-ru.md) and
|
||||
[`localization-cs.md`](localization-cs.md).
|
||||
[`localization-de.md`](localization-de.md), [`localization-ru.md`](localization-ru.md),
|
||||
[`localization-cs.md`](localization-cs.md) and [`localization-pl.md`](localization-pl.md).
|
||||
|
||||
## Adding a language
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Lightroom parity checklist
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** minor (integration batch 36: slideshow module, print-ready PDF fixes, local adjustment presets, Layout Image loupe overlay, Delete in an album removes from it, new languages Czech, Polish, Italian-ready catalogs; many rows' notes updated by their PRs) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-15 · **Change:** patch (LR-BEHAV-LOCALIZE cites the Polish localization notes) · **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,8 +479,8 @@ differences and missing bindings are in [ui-parity.md](ui-parity.md#shortcuts).
|
||||
| LR-BEHAV-TEXTFIELD | Text fields behave alike | P1 | 🟡 | `crates/ui-egui/src/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/panels/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/text_field.rs`, `crates/ui-egui/src/panels/grid.rs`, `crates/ui-egui/tests/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/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). Brush strokes and red-eye ellipses are pointer-only; not tried with a real screen reader ([audit](ui-parity.md#accessibility-audit)) |
|
||||
| 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` | 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` | One table entry per language (code, endonym, ISO 15924 script, catalog): English, Simplified Chinese, Traditional Chinese (Taiwan), Japanese, Brazilian Portuguese, Spanish, German, Russian and Ukrainian 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 face in WASM while loading the Simplified Chinese face from a separate font file. |
|
||||
| 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.polish` | 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-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 and Ukrainian 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 face in WASM while loading the Simplified Chinese face from a separate font file. |
|
||||
| LR-BEHAV-LEARN | Tutorials | OOS | 🚫 | | |
|
||||
| LR-BEHAV-WHATSNEW | What's new | P2 | ✅ | `cmd:app.whatsNew`, `docs/whats-new.md` | Help ▸ What's New: release highlights |
|
||||
| LR-BEHAV-AI-EA | Early-access badges | P2 | ⬜ | | |
|
||||
@@ -864,3 +864,4 @@ Latin stays upright. Advanced Japanese composition remains open. Regression cove
|
||||
| 2026-10-13 | minor | LRC-LIB-CATALOG-IMPORT review: offline Local promotion and result dismissal across library switches covered; redundant operation/settings copies removed. Status and summary counts unchanged. |
|
||||
| 2026-10-14 | patch | LRC-LIB-CATALOG-IMPORT: reconciled with upstream phased progress, cancellation kinds, WAL-only import, translations and current progress tracking. Status and summary counts unchanged. |
|
||||
| 2026-10-13 | minor | KEYC-COMPARE: `=` / `-` (also `+`) increase / decrease the grid thumbnail size (`view.thumbSizeUp` / `view.thumbSizeDown`, View menu), grids only; status unchanged (🟡) |
|
||||
| 2026-10-15 | patch | LR-BEHAV-LOCALIZE: cites `docs/localization-pl.md` (Polish format messages finished, counts right for every number); status unchanged (🟡) |
|
||||
|
||||
Reference in New Issue
Block a user