Conflicts:
- README.md, docs/localization.md: language lists keep every language, Swedish appended
- assets/ATTRIBUTION.md: union of rows
- crates/ui-egui/src/i18n.rs: language table and command test list keep it, ka and sv; both tests kept
- crates/ui-egui/src/menus.rs: language commands keep it, ka and sv
- crates/ui-egui/src/panels/keyword_list.rs: code list gains sv; Locale::ALL.len() is 15
@@ -34,6 +34,7 @@ covers a whole directory), or if a licence file referenced in the Licence column
| `crates/ui-egui/locales/cs.json`, `crates/ui-egui/locales/cs-formats.json` | Czech interface catalogs | @Losminek with AI assistance (Codex) | original work: translations of English source phrases, reviewed against the app UI conventions; no external translation material | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 2026-10-11 | catalog coverage, Czech dates and count-neutral wording; independent scope/terminology review; native-speaker proofreading pending |
| `crates/ui-egui/locales/it.json`, `crates/ui-egui/locales/it-formats.json` | Italian interface catalogs | @GabrielePecchioli with Claude Code; PhotoCraft, VectorCraft, PdfCraft and WordCraft translation contributors for reused labels | original translations from English source; 410 initial English-key matches reviewed from [PhotoCraft da3da09](https://github.com/storytold/photocraft/blob/da3da0942c14c1159f40c652afcf33584332c733/crates/ui-egui/src/i18n/it.tsv), [VectorCraft 5432821](https://github.com/storytold/vectorcraft/blob/543282148007bcb5633c493a5374cd26b0339c8d/crates/ui-egui/src/i18n/it.tsv), [PdfCraft e8e275c](https://github.com/storytold/pdfcraft/blob/e8e275cbd40ccd0dc6b56f82b16a575571043702/crates/ui-egui/src/i18n/it.tsv) and the Italian WordCraft catalog ([storytold/wordcraft#598](https://github.com/storytold/wordcraft/pull/598)); 46 of them retranslated where the sibling's meaning didn't fit a photo app | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`, also the source repositories' licences) | 2026-10-12 | adapted to LightCraft photo-development context, count-neutral labels for Italian plural agreement, reviewed placeholders |
| `crates/ui-egui/locales/ka.json`, `crates/ui-egui/locales/ka-formats.json` | Georgian interface catalogs | Davit Matchakhelidze with Claude; WordCraft, GridCraft, PhotoCraft, FilmCraft and VectorCraft Georgian catalogs for reused labels | original translations from the English source (meaning-based, no vendor localization used); 450 English-key matches reused from the sibling Craft apps' Georgian catalogs | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 2026-10-12 | adapted to LightCraft photo-library and raw-development context; count-neutral numerals; placeholders checked |
| `crates/ui-egui/locales/sv.json`, `crates/ui-egui/locales/sv-formats.json` | Swedish interface catalogs | LightCraft contributors | original work: clean-room Swedish translations of English source phrases | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 2026-10-15 | none |
Notes
- Fonts authored or published by Adobe (Source Sans/Serif/Code, Source Han, …) are not used, even though some are
" · {} original{} left at the source":" · {} original{} kvar i källan",
" · {} restored from Recently Deleted":" · {} återställda från Nyligen raderade",
" — Capture One won't import a list with ; , < or > in a keyword: {names}":" — Capture One importerar inte en lista med ; , < eller > i ett nyckelord: {names}",
" — kept but not applied: {}":" — behålls men tillämpas inte: {}",
" — left out, as a keyword list can't hold them: {names}":" — utelämnade, eftersom en nyckelordslista inte kan innehålla dem: {names}",
" — not carried over: {}{}":" — fördes inte över: {}{}",
"+{n} more":"+{n} till",
"+{} more":"+{} till",
", {failed} file{} not readable":", {failed} fil{} kunde inte läsas",
", {} label":", {} etikett",
", {} star{}":", {} stjärna{}",
"1 task is still running: {names}. Quitting stops it.":"1 uppgift körs fortfarande: {names}. Om du avslutar stoppas den.",
"; {kept} already had a location":"; {kept} hade redan en plats",
"; {n} gained synonyms":"; {n} fick synonymer",
"; {outside} outside its time range":"; {outside} utanför sitt tidsintervall",
"Add {local_n} to My Photos":"Lägg till {local_n} i Mina foton",
"Add {} Photo{}":"Lägg till {} foto{}",
"Add {} Photo{}, restore {}":"Lägg till {} foto{}, återställ {}",
"Add “{}” to Favorites":"Lägg till ”{}” i Favoriter",
"Added {n} keyword{}":"Lade till {n} nyckelord{}",
"Added {n} photo{} to My Photos":"Lade till {n} foto{} i Mina foton",
"Added {n} photo{} to “{}”":"Lade till {n} foto{} i ”{}”",
"Added {what} to {name}":"Lade till {what} i {name}",
"Added “{keyword}” to {n} photo{}":"Lade till ”{keyword}” på {n} foto{}",
"Adding photos… {} of {}":"Lägger till foton… {} av {}",
"All {n} selected photos move by the same amount.":"Alla {n} markerade foton flyttas lika mycket.",
"Already in the library, in Recently Deleted: {} photo{} selected · right-click ▸ Restore, or Delete Permanently to import afresh":"Finns redan i biblioteket, i Nyligen raderade: {} foto{} markerade · högerklicka → Återställ, eller Radera permanent för att importera på nytt",
"Already in the library: {} photo{} selected in All Photos":"Finns redan i biblioteket: {} foto{} markerade i Alla foton",
"Applied {name}":"Tillämpade {name}",
"Apply to “{mask}” on Selected Photos":"Använd på ”{mask}” i markerade foton",
"Auto ({})":"Auto ({})",
"Auto Import: added {} photo{}":"Automatisk import: lade till {} foto{}",
"Auto Sync: edits apply to {n} photos":"Automatisk synkning: ändringar gäller {n} foton",
"Downloads from {host}. Once it has arrived and checked out, LightCraft installs it, {after}.":"Laddas ned från {host}. När den har kommit fram och kontrollerats installerar LightCraft den, {after}.",
"Imported {n} preset{}, {f} file{} not readable":"Importerade {n} förinställning{}, {f} fil{} kunde inte läsas",
"Imported {profiles} profile{} (Profile browser ▸ their groups)":"Importerade {profiles} profil{} (Profilbläddrare → deras grupper)",
"Imported {} photo{}":"Importerade {} foto{}",
"In line for AI Denoise ({ahead} ahead)…":"I kö för AI-brusreducering ({ahead} före)…",
"Insert at the cursor (also written {})":"Infoga vid textmarkören (skrivs även {})",
"It is taken off {count} photo{}, with the keywords below it. Undo brings it back.":"Det tas bort från {count} foto{}, tillsammans med nyckelorden under det. Ångra återställer det.",
"Keywords of {n} selected photos":"Nyckelord för {n} markerade foton",
"Label Set: {name}":"Etikettuppsättning: {name}",
"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 kan inte avkoda den här raw-varianten än ({}). Du redigerar kamerans inbäddade JPEG-förhandsgranskning, som redan innehåller kamerans bildstil (t.ex. Monokrom) och vitbalans.",
"LightCraft could not open its window: {e}":"LightCraft kunde inte öppna sitt fönster: {e}",
"LightCraft could not open its window: {e}\n\nThe log file has the details: {path}":"LightCraft kunde inte öppna sitt fönster: {e}\n\nDetaljer finns i loggfilen: {path}",
"LightCraft stopped unexpectedly: {e}\n\nThe log file has the details: {path}":"LightCraft avslutades oväntat: {e}\n\nDetaljer finns i loggfilen: {path}",
"Lightroom geometry for {path} was not preserved; Guided Upright saved transform is unsupported.":"Lightroom-geometrin för {path} bevarades inte; sparad transformering med guidad Upright stöds inte.",
"Lightroom geometry for {path} was not preserved; saved transform is ignored because Upright is Off.":"Lightroom-geometrin för {path} bevarades inte; den sparade transformeringen ignoreras eftersom Upright är av.",
"Lightroom geometry for {path} was not preserved; saved Upright transform is unsupported.":"Lightroom-geometrin för {path} bevarades inte; sparad Upright-transformering stöds inte.",
"Lightroom geometry was not preserved for {path}; {mode} will be recalculated.":"Lightroom-geometrin bevarades inte för {path}; {mode} beräknas om.",
"Lightroom import complete: {imported} photos added":"Lightroom-importen är klar: {imported} foton har lagts till",
"Lightroom import complete: {imported} photos added, {failed} failed":"Lightroom-importen är klar: {imported} foton har lagts till, {failed} misslyckades",
"Lightroom import complete: {imported} photos added; index warning: {warning}":"Lightroom-importen är klar: {imported} foton har lagts till; indexvarning: {warning}",
"Reading Lightroom catalog… {done} of {total}":"Läser Lightroom-katalogen… {done} av {total}",
"Reading photos… {done} of {total}":"Läser foton… {done} av {total}",
"Reading photos… {} of {}":"Läser foton… {} av {}",
"Redo {}":"Gör om {}",
"Remove “{name}”":"Ta bort ”{name}”",
"Remove “{name}” and its {count} photo{} from the library?":"Vill du ta bort ”{name}” och dess {count} foto{} från biblioteket?",
"Remove “{}” from Favorites":"Ta bort ”{}” från Favoriter",
"Removed from {}":"Borttaget från {}",
"Removed {what} from {name}":"Tog bort {what} från {name}",
"Removed “{name}” from {n} photos. Edit ▸ Undo puts it back.":"Tog bort ”{name}” från {n} foton. Redigera → Ångra lägger tillbaka det.",
"Rename {n} Photos…":"Byt namn på {n} foton…",
"Rename “{name}”":"Byt namn på ”{name}”",
"Renames {n} face{} across the library. The files are not changed.":"Byter namn på {n} ansikte{} i hela biblioteket. Filerna ändras inte.",
"Renames “{from}” on {n} photo{} (keywords below it too). Use | for levels, e.g. Travel|Italy. An existing name merges the two.":"Byter namn på ”{from}” på {n} foto{} (även nyckelord under det). Använd | för nivåer, t.ex. Resor|Italien. Ett befintligt namn sammanfogar de två.",
"Rendering on the CPU: {why}":"Renderar på processorn: {why}",
"Replace {} with:":"Ersätt {} med:",
"Reset {name}":"Återställ {name}",
"Reset {} Channel":"Återställ kanalen {}",
"Restore {}":"Återställ {}",
"Restore {} Photo{}":"Återställ {} foto{}",
"Restored {} photo{} from Recently Deleted":"Återställde {} foto{} från Nyligen raderade",
"Running on the processor: {}.":"Körs på processorn: {}.",
"Running on {}.":"Körs på {}.",
"Saved export preset “{}”":"Exportförinställningen ”{}” har sparats",
"Saved template {name}":"Mallen {name} har sparats",
"Scores {scope} for focus and exposure and finds similar shots taken within seconds of each other (bursts).":"Bedömer {scope} efter fokus och exponering och hittar likartade bilder tagna inom några sekunder från varandra (serier).",
"Shows the model's terms, then downloads {} from {host}, installs it and starts using it. Nothing else is sent.":"Visar modellens villkor, hämtar sedan {} från {host}, installerar den och börjar använda den. Inget annat skickas.",
"Skipped {problem}":"Hoppade över {problem}",
"Slideshow exported: {what}":"Bildspelet har exporterats: {what}",
"Smart album: {}":"Smart album: {}",
"Tagged {n} photo{} from the tracklog":"Taggade {n} foto{} från spårloggen",
"Template preview: {name}":"Förhandsgranskning av mall: {name}",
"The SAM 3 download failed: {e}":"Hämtningen av SAM 3 misslyckades: {e}",
"The XMP sidecars of {n} photos couldn't be written (is their folder offline?). LightCraft keeps trying.":"XMP-sidofilerna för {n} foton kunde inte skrivas (är mappen offline?). LightCraft fortsätter att försöka.",
"the {n} selected photos":"de {n} markerade fotona",
"the {} photos in view":"de {} fotona i vyn",
"There is a keyword set “{name}” already":"Det finns redan en nyckelordsuppsättning ”{name}”",
"There is a “{name}” at the top level already. Merge the two?":"Det finns redan ett ”{name}” på översta nivån. Vill du sammanfoga dem?",
"these {count} photos":"dessa {count} foton",
"Trained on: {provenance}":"Tränad på: {provenance}",
"Undo {}":"Ångra {}",
"Unknown tag{s} {} stay{} as typed (see Tags)":"Okända taggar ({}) behåll{s}{} som de skrevs (se Taggar)",
"Update “{name}” with Current Settings":"Uppdatera ”{name}” med aktuella inställningar",
"Updated {name}":"{name} har uppdaterats",
"Updated “{name}”":"”{name}” har uppdaterats",
"Version {} — a clean-room, pure-Rust photo library and raw developer.":"Version {} – ett fotobibliotek och raw-framkallare i ren Rust, utvecklat enligt clean room-metoden.",
"Version: {}":"Version: {}",
"Virtual copy “{name}” of {of}":"Virtuell kopia ”{name}” av {of}",
"Working on {what} for {} photos…":"Arbetar med {what} för {} foton…",
"XMP adjustments were not imported for {path}: {fields}.":"XMP-justeringar importerades inte för {path}: {fields}.",
"XMP profile \"{profile}\" was not applied for {path}; colors may differ from Lightroom.":"XMP-profilen \"{profile}\" tillämpades inte för {path}; färgerna kan skilja sig från Lightroom.",
"{:.1} MB":"{:.1} MB",
"{count} more warnings.":"{count} varningar till.",
"{f} folders (and their subfolders)":"{f} mappar (och deras undermappar)",
"{label} Grading":"Gradering: {label}",
"{label} {d:+} on every selected photo":"{label} {d:+} på varje markerat foto",
"{label} {index} of {n}":"{label} {index} av {n}",
"{label}, {n} photos":"{label}, {n} foton",
"{matching} of {t} photos":"{matching} av {t} foton",
"{matching} photos":"{matching} foton",
"{missing} originals are missing. Their catalog records are available; use Find Missing Photos to relink them.":"{missing} original saknas. Deras katalogposter finns kvar; använd Sök efter saknade foton för att länka om dem.",
"{name} opened for editing; it is stacked with the original":"{name} öppnades för redigering; den är staplad med originalet",
"{name} opened in the other editor":"{name} öppnades i den andra redigeraren",
"{name} · {terms}":"{name} · {terms}",
"{name} — double-click to reset it":"{name} – dubbelklicka för att återställa",
"{n} added to Apple Photos":"{n} tillagda i Apple Photos",
"{n} added to Apple Photos album “{album}”":"{n} har lagts till i Apple Photos-albumet ”{album}”",
"{n} change{} couldn't be written to disk: {e}\nIf you quit now, {} lost.":"{n} ändring{} kunde inte skrivas till disken: {e}\nOm du avslutar nu går {} förlorade.",
"{n} change{} saved in memory but not written to disk: {e}\nLightCraft retries automatically; quitting now would lose {}.":"{n} ändring{} har sparats i minnet men inte skrivits till disken: {e}\nLightCraft försöker igen automatiskt. Om du avslutar nu går {} förlorade.",
"{n} change{} saved in memory but not written to disk: {e} — LightCraft will retry":"{n} ändring{} har sparats i minnet men inte skrivits till disken: {e} – LightCraft försöker igen",
"{n} found · {sel} selected":"{n} hittade · {sel} markerade",
"{n} JPEG files":"{n} JPEG-filer",
"{n} Local photo{} skipped: albums hold library photos (Add to My Photos first)":"{n} lokala foto{} hoppades över: album innehåller foton från biblioteket (lägg först till i Mina foton)",
"{n} originals opened in the other editor":"{n} original har öppnats i den andra redigeraren",
"{n} pages":"{n} sidor",
"{n} photos":"{n} foton",
"{n} photos in view · {slides} slides · {time}":"{n} foton i vyn · {slides} bilder · {time}",
"{n} photos in {} are hidden by the filters above":"{n} foton i {} döljs av filtren ovan",
"{n} photos opened for editing; each is stacked with its original":"{n} foton har öppnats för redigering; vart och ett staplas med sitt original",
"{n} photo{}":"{n} foto{}",
"{n} photo{} match · updates automatically as photos change":"{n} foto{} matchar · uppdateras automatiskt när fotona ändras",
"{n} photo{} now · updates automatically as photos change":"{n} foto{} just nu · uppdateras automatiskt när fotona ändras",
"{n} preset{}":"{n} förinställning{}",
"{n} raws can now be developed from their raw data":"{n} raw-filer kan nu framkallas från sina rådata",
"{n} similar photo{} · View ▸ Clear Filters to see all":"{n} likartade foto{} · Visa → Rensa filter för att se alla",
"{n} tasks are still running: {names}. Quitting stops them.":"{n} uppgifter körs fortfarande: {names}. Om du avslutar stoppas de.",
"{n} {noun}":"{n} {noun}",
"{pct} %":"{pct} %",
"{photos} catalog records processed; {collections} collections.":"{photos} katalogposter bearbetade; {collections} samlingar.",
"{what} merge added at {mp}, the largest a panorama can be (its full size is {full})":"{what}-sammanfogning tillagd med {mp}, den största storlek ett panorama kan ha (full storlek är {full})",
"{what} merge added at {mp}: its full size, {full}, needs more memory than this computer has":"{what}-sammanfogning tillagd med {mp}: full storlek, {full}, kräver mer minne än den här datorn har",
"{} files and {f} folder{}":"{} filer och {f} mapp{}",
"{} item{}":"{} objekt{}",
"{} KB":"{} kB",
"{} label (click more labels to show any of them)":"Etiketten {} (klicka på fler etiketter för att visa foton med någon av dem)",
"{} MB":"{} MB",
"{} of 4 guides — drag along lines that should be vertical or horizontal.":"{} av 4 stödlinjer – dra längs linjer som ska vara vertikala eller horisontella.",
"{} photo{} not readable":"{} foto{} kunde inte läsas",
"{} sample{}":"{} sample{}",
"{} sec":"{} s",
"{} spot(s) on this photo":"{} fläck(ar) på det här fotot",
"{} · {}. Kept in the library's “denoise” folder; the oldest ones that no photo uses go first when the limit is reached.":"{} · {}. Sparas i bibliotekets mapp ”denoise”; de äldsta som inget foto använder tas bort först när gränsen nås.",
"{} — show their photos":"{} – visa deras foton",
"· {dups} already in the library":"· {dups} finns redan i biblioteket",
"· {trashed} in Recently Deleted":"· {trashed} i Nyligen raderade",
"“{parent}” has a “{name}” already. Merge the two?":"”{parent}” har redan en ”{name}”. Vill du sammanfoga dem?",
"“{to}” is already a person. Combining them makes one person; Undo separates them again.":"”{to}” är redan en person. Om du kombinerar dem blir de en person; Ångra skiljer dem åt igen.",
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`), Czech (`cs`) and Georgian (`ka`). 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`), Georgian (`ka`) and Swedish (`sv`). 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),
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.